2012-03-26 11 views
6

CoffeeScript変数のスコープの仕方を理解しようとしています。 ドキュメントによると:CoffeeScript変数スコープについての混乱

この動作はローカル 変数のためのRubyの範囲を効果的に同じです。

しかし、私はそれは異なる動作をしていることが分かりました。ルビー

a = 1 
def f 
    a = 3 
end 
puts a #This displays 1 

CoffeeScriptの

a = 1 
changeValue = -> a = 3 
changeValue() 
console.log "a: #{a}" #This displays 3 

誰かが、それをしてください説明できますか?

答えて

8

Rubyのローカル変数([-Z_]から始まる)are really local to the block they are declared in。あなたが投稿したRubyの動作は正常です。あなたのコーヒーの例では

、あなたは参照closureを持っています。関数宣言ではありません。あなたのRubyの例では

、あなたはクロージャが、関数宣言を持っていません。これは違う。あなたのコーヒーにRubyのと同等です:閉鎖で

a = 1 
changeValue = lambda do 
    a = 3 
end 
changeValue() 

、ローカル変数が存在ブロックが宣言されたときにブロックが実行されたときにまだアクセスできます。これは閉鎖の力の1つです!

+0

私は理解しています。ありがとう。 –

0

changeValue関数内で使用される変数は、グローバル変数aです。 CoffeeScriptのは、次のJavaScriptにコンパイルされること(つまり、ローカル変数を使用)changeValuea変数を変更しないようにするためには

var a, changeValue; 
a = 1; 
changeValue = function() { 
    return a = 3; 
}; 
changeValue(); 
console.log("a: " + a); 

、あなたがaという名前の関数に引数を持っている必要がありますいずれか(どのその関数の局所変数としてaを作成するか、またはvar a = 3;を使って関数内のローカル変数としてaを宣言します(CoffeeScriptが何であるかはわかりませんが、私はCoffeeScriptの人ではありません)。

Some examples of JavaScript variable scope.

+1

私はJavaScriptの場合を理解しています。しかし、CoffeeScriptでは、私は関数を定義するときにすべてのグローバル変数を考慮することができないので、ローカル変数は常にグローバル変数をシャドウするべきだと思います。 –