4

私のJSコード:-

 var ul = document.createElement("ul");
    for(var i=0; i<10; i++){
    var li= document.createElement("li");
    li.innerHTML='this is my li  '+ i+ '.';
    li.onclick = (function (){
        return (function (){
            alert(i);
        })
    })();
    ul.appendChild(li);
    }

    document.body.appendChild(ul);

テストコード -- http://jsfiddle.net/VhfEh/112/

Html ビュー :-

this is my li 0.
this is my li 1.
this is my li 2.
this is my li 3.
this is my li 4.
this is my li 5.
this is my li 6.
this is my li 7.
this is my li 8.
this is my li 9.

いずれかをクリックするliと、最大値iまたは値である 10 が表示されi++ます。

私は何かを試しましたが、うまくいきませんか??

疑問 :-

  • 関数内の関数は JavaScript の Closure ではありませんか?

  • 私が使用している例は、JavaScript Closure の例です??

ありがとう !!

4

2 に答える 2

4

あなたは本当に近くにいます。その無名関数でパラメーターを設定して使用するのを忘れただけです。

li.onclick = (function (i) {
    return (function (){
        alert(i);
    })
})(i);

すぐに実行される関数の要点は、各ハンドラーにループ変数のプライベート コピーを与えることです。そのため、実際にはそのようなパラメーターとして渡す必要があります。

于 2013-10-10T18:13:19.950 に答える
2

あなたは閉鎖が必要であることについて正しいです。

i関数本体によって作成されたクロージャー内のどこかを保持する必要があります。

li.onclick = (function (){
    var localI = i;
    return (function (){
        alert(localI);
    })
})();
于 2013-10-10T18:14:25.983 に答える