//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)を使用するときにクロージャを使用する必要がないのはなぜですか?
* "閉包は' i'の値を保持するために使われます* **いいえ!** *閉包*は*解*とは関係ありません。重要なのは、各反復で関数を実行して新しい*スコープ*を作成することです(反復ごとに)。関数がクロージャであるかどうかは関係ありません。 –