2017-05-29 10 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において必要とされません。どのようにletiの値を保持するのに役立ちますか? ありがとうございます。let(ES6)を使用するときにクロージャを使用する必要がないのはなぜですか?

+1

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

答えて

1

letは、forループの各繰り返しに対してitemという新しいコピーを定義するためです。 forループの各反復で自動的に別々の変数を作成するので、クロージャを手動で作成する必要はありません。

letで定義された変数はブロックスコープです。だから、あなたのforループの各反復は新しいブロックなので、let itemの新しい定義です。

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

、あなたはまた、forループの各反復のためiの新しいコピーを入手して、もう一度、あなたが持っていない:のように

あなたがforループの宣言でletを使用し、 forループ内でその値を保持するためにクロージャを使用することは自動的に行われます。

+0

ああ..そうです。クイックレスポンスに感謝します:) – grepLines

関連する問題