2012-03-26 25 views
6

我想了解CoffeeScript變量是如何作用域的。 根據文檔:關於CoffeeScript變量作用域的困惑

此行爲是有效等同於Ruby的範圍爲本地 變量。

不過,我發現它的工作方式不同。

在CoffeeScript的

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

在Ruby

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

有人能解釋它,好嗎?

回答

8

Ruby的本地變量(從[A-Z_])are really local to the block they are declared in。所以你發佈的Ruby行爲是正常的。

在你的咖啡例子,你有一個closure引用。這不是一個函數聲明。

在你的Ruby例子,你沒有封閉,但函數聲明。這是不同的。紅寶石相當於你的咖啡是:

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

在封閉,局部變量存在時該塊聲明仍然可以訪問在執行塊時。這是關閉的權力之一!

+0

現在我明白了。謝謝。 – 2012-03-26 02:31:55

0

a變量在changeValue函數裏面使用的是全局變量a。這CoffeeScript中會被編譯成以下JavaScript:

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

爲了changeValue不改變a變量(即使用一個局部變量),你要麼需要有一個參數名爲a功能(這會創建一個作爲該函數的本地變量)或者聲明a作爲函數內的局部變量使用var a = 3;(不確定CoffeeScript是什麼,我不是CoffeeScript人)。

Some examples of JavaScript variable scope.

+1

我瞭解JavaScript情況。但在CoffeeScript中,我認爲局部變量應該總是影響全局變量,因爲當我定義一個函數時,我不能考慮所有的全局變量。 – 2012-03-26 02:31:01