2014-04-03 82 views
1

我已經閱讀了關於JS範圍的一些指南,但是我不太瞭解這裏發生了什麼。我對費用變量綁定有一些困惑

確實工作:

var b = 6; 
function a(){ 
    alert(b); 
} 
a(); //alerts 6 

然而,這使得螢火蟲說 「X沒有定義」

var funcB = function(){ 
    alert(x); 
} 

function funcA(anonymous){ 
    var x = 10; 
    anonymous(); 
} 

funcA(funcB); 

那麼,爲什麼不funcB自由變量x獲得綁定到x在funcA的第一行中聲明爲10?

感謝

+0

'var'聲明**局部**變量。請參閱http://stackoverflow.com/questions/111102/how-do-javascript-closures-work/111200#111200 – elclanrs

回答

1

在JavaScript中的每個功能都有自己的Lexical Environment:在它使用的標識符(名稱)之間的映射,以及特定變量(和函數)或者存在(在外部範圍中)或將在此函數的範圍內創建。

關鍵在於給定函數的詞法環境是在定義此函數時創建的,而不是在執行時才創建。

在你的第二個例子,xfuncB提到沒有任何關係映射到 - 有沒有在自己的範圍或父(外)作用域命名x變量。與第一個例子不同的是,b可以映射到名爲b的局部變量,生活在同一個作用域函數a中。

當然,funcB不能(也不應該)知道其他函數的詞法環境,因爲它不能(也不應該)知道它是否會在這些函數中調用 - 或者不能。

+0

「定義時創建,不執行時」。這解釋了它。謝謝。 – user3391564

1

你不能這樣做,因爲var聲明局部變量,僅在聲明它的功能範圍內可見。

無論是funcB身體裏面並沒有看到是什麼在funcA身體,你必須要明確的(傳遞參數),或宣佈funcBfuncA時可以關上x(封閉)。

所以你可以做的是讓funcB採取x作爲參數:

var funcB = function(x) { 
    alert(x); 
}; 

function funcA(fn) { 
    var x = 10; 
    fn(x); 
} 

funcA(funcB); 
+0

但是,不是在聲明x的範圍內(即在funcA中)對匿名進行的調用?我知道我可以使用參數來實現功能 - 這只是一個實驗。 – user3391564

+0

看看我的編輯是否有幫助... – elclanrs

+0

把我拋棄的原因是我不知道在創建函數期間綁定了自由變量,而不是函數的執行。 – user3391564