2017-05-29 78 views
1
//A.Using let 
var list = document.getElementById('list'); 

for (let i = 1; i <= 5; i++) { 
    let item = document.createElement('li'); 
    item.appendChild(document.createTextNode('Item ' + i)); 

    item.onclick = function(ev) { 
     console.log('Item ' + i + ' is clicked.'); 
    }; 
    list.appendChild(item); 
} 


//B. Using var 
// to achieve the same effect with 'var' 
// you have to create a different context 
// using a closure to preserve the value 
for (var i = 1; i <= 5; i++) { 
    var item = document.createElement('li'); 
    item.appendChild(document.createTextNode('Item ' + i)); 

    (function(i){ 
     item.onclick = function(ev) { 
      console.log('Item ' + i + ' is clicked.'); 
     }; 
    })(i); 
    list.appendChild(item); 
} 
問題:

正如在B節中,封閉件被用來保存值i,但其中使用let不需要在A節封閉。 let如何幫助保留i的價值? 謝謝。爲什麼在使用let(ES6)時不需要使用閉包?

+1

*「一個閉包被用來保存'i'的值。」* **否!** *閉包*與*解*無關。重要的部分是你正在執行一個函數(在每次迭代中),從而創建一個新的範圍*(每次迭代)。函數是否是閉包是無關緊要的。 –

回答

1

因爲letfor循環的每次迭代定義了item的新副本。它會在for循環的每次迭代中自動爲您創建一個單獨的變量,因此您不必通過創建閉包來手動執行此操作。

let定義的變量是塊的作用域。因此,for循環的每次迭代都是一個新塊,因此是let item的新定義。

當你在for循環的聲明中使用let,如:

for (let i = 1; ....) 

,那麼你還可以獲得ifor循環的每個迭代,並再次一個新的副本,你不必使用閉合在for循環內保留該值 - 這是自動完成的。

+0

哦..沒錯。謝謝你的快速回應:) – grepLines

相關問題