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我得到 10 .. 这是最大值ii++值..

我尝试了一些东西,但它不起作用??

怀疑:-

  • 函数中的函数不是 JavaScript 中的闭包?

  • 我正在使用的示例是 JavaScript 闭包示例??

谢谢 !!

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 回答