2012-02-02 58 views
2

在我開始之前,我意識到ECMA腳本規範可能會回答我的問題,但我希望能夠回答這個問題。解釋爲什麼Javascript中的匿名函數可以訪問外部函數中的變量?

看看下面的代碼:

function test1(param) { 
    alert(param); 
} 

function test2() { 
    var testvar = 99; 
    setTimeout(function(){ test1(testvar); }, 1000); 
} 

test2(); 

如果我運行此代碼,我得到展示99 我的問題是,在test2,不應testvartest2完成後運行爲null一個彈出框? setTimeout中的匿名函數如何得到testvar的值? setTimeout被調用時是否有某種堆棧複製正在進行?

+0

提示:Google「關閉」。 – cHao 2012-02-02 21:07:44

+0

去搶一瓶伏特加,並閱讀這個問題。我會盡力給你一個答案,但我的辦公室沒有酒精政策。 http://stackoverflow.com/questions/500431/javascript-variable-scope – aehiilrs 2012-02-02 21:10:21

+0

太棒了。謝謝您的幫助。 – quuxbazer 2012-02-02 21:22:38

回答

3

這是closures的結果。 JavaScript中的函數保留對「close over」的引用 - 在其詞彙範圍中定義的變量。也就是說,創建setTimeout函數時可以引用的所有變量都可以在test2返回後很長時間引用。

通過這種方式,閉包既是一個函數,也是一組綁定到創建函數時在範圍內的變量的綁定。這就是爲什麼封閉有時被稱爲poor man's objects(和反之亦然)。

+1

謝謝!我不知道這裏有一個名字。你會認爲在我作爲一名計算機科學大學四年後,他們至少會提到這一點。 – quuxbazer 2012-02-02 21:22:06

0

該功能被稱爲closures。對於發生的情況,你基本上是正確的,如果需要匿名函數,周圍範圍的變量將被保存。

1

這發生是由於Javascript Closures。本質上,函數在定義時可用的變量始終可用,無論函數來自何處。

相關問題