2017-10-20 111 views
1

我想了解範圍如何在JS中工作。你能告訴我,如果我有這個塊的代碼的理解是否正確:瞭解JavaScript範圍

for(var i = 0; i<5; i++){ 
setTimeout(function timeoutHandler() { 
    var i = i; 
    console.log(i); //undefined 
}) 
} 

console.log打印undefined 5倍。據我瞭解,當執行timeoutHandler時,它有自己的本地範圍和自己的i變量。那麼,在執行timeoutHandler時,解釋器是否要求變量i,是否在本地作用域中聲明並使用此聲明的變量進行賦值?這解釋了爲什麼它是undefined,但我不確定我是否完全正確。 感謝

UPD 我並不需要此代碼才能正常工作,我只是想知道爲什麼它的行爲一樣,在這種情況下

+0

'變種I = i'的setTimeout的回調處理器中的'i'創建一個新的範圍和'i'尚未分配給它之前還沒有定義爲'再次i'。因此'我'是'未定義的'。 – gurvinder372

+0

首先'var i = i'沒有意義。 – evolutionxbox

+0

'var i = i'等同於'var i;我=我;'。 – JJJ

回答

0

試圖通過這個例子來理解它:

for(var i = 0; i<5; i++){ 
 
//create a self executing function 
 
(function(iValue){ 
 
    //in this scope iValue has the i from the loop 
 
    setTimeout(function() { 
 
    console.log(iValue); //will print the correct i 
 
}) 
 
})(i); //pass i in it's current context to the function 
 
}

或用ES6簡單: 使用let而不是var。 由於let在塊內的作用域內(每次循環都是自己的塊),所以它不會在setTimeout內獲得另一個值。

for(let i = 0; i<5; i++){ 
 
    setTimeout(function() { 
 
    console.log(i); //will print the correct i 
 
}) 
 
}