2009-11-19 68 views
3

我一直在用JS開發一段時間,雖然我知道下面的代碼工作,但我並不真正瞭解爲什麼它的工作原理。Javascript關閉/變量範圍問題 - 我知道它可行,但爲什麼?

我看到它的方式,我在testClosure函數中定義的TestString,和我期待的是變量「走」的時候testClosure功能完成,因爲它是局部變量。

但是,當我用計時器調用內部函數時,它仍然知道testString變量。爲什麼?當testClosure完成執行時,那個變量是不是在五秒鐘之前消失了?內部函數是否可以引用testClosure中的所有變量,並且它們保持有效,直到所有內部函數完成爲止?

function testClosure() { 
    var testString = 'hai'; 

    // after 5 seconds, call function below 
    window.setTimeout(function() { 

    // check if function knows about testString  
    alert(testString); 

    }, 5000);   
} 

testClosure(); 
+0

很好的問題。我想這取決於是否'setTimeout'在本質上是異步的,以及'setTimeout'是否具有某種特殊屬性,它在啓動超時部分時保留它需要的信息,然後在執行時使用它... – Jason

+1

dup of http:// stackoverflow.com/questions/111102/how-does-a-javascript-closure-work和其他 –

回答

2

function特殊形式創建詞法範圍。在該範圍內創建的任何對象都會在其創建時在範圍內看到環境(名稱與值的綁定)。

事實上,建立一個功能是建立在JavaScript中的詞法範圍的唯一辦法,這就是爲什麼你看到這樣的扭曲所有的時間:

return (function() { 
    var privateVariable = 'foo'; 
    return { 
     myProp: privateVariable 
    }; 
})(); 
+0

我的下一站是:http://stackoverflow.com/questions/1047454/what-is-lexical-sc開放:)感謝您的答案! – Rudi

2

一句話,是的。發現。

0

testString存在於testClosure的範圍內,因此就您的計時器而言,testString是一個全局變量。

How do JavaScript closures work?

有更好的答案,斯科特提及。