后期绑定onclick事件

Kau*_*eya 0 javascript jquery closures

以下是我的javscript的一部分(使用jquery).

list = ['a', 'b', 'c'];
for(var i = 0 ; i< list.length ; i++) {
   $("<a>click here</a>").
      click(function(){
          foo(list[i]);
      }).
      appendTo('#sometag');
}
function foo(val) {
    console.log(val);
}
Run Code Online (Sandbox Code Playgroud)

无论您点击哪个标签,都会打印c.如何打印正确值???
它似乎正在使用i = 3的最后一个值,因此总是评估oc

ade*_*neo 6

在触发事件处理程序之前迭代完成时,您需要一个闭包新作用域,因此当单击发生时,循环已完成并且i是它设置的最后一个值,新作用域将i本地值保留到该作用域

list = ['a', 'b', 'c'];

for(var i=0; i<list.length; i++) {

   (function(j) {

       $("<a>click here</a>").click(function(){
          foo(list[j]);
       }).appendTo('#sometag');

   }(i));

}

function foo(val) {
    console.log(val);
}
Run Code Online (Sandbox Code Playgroud)

另一个选择是添加更多jQuery

list = ['a', 'b', 'c'];

$.each(list, function(index, item) {
    $("<a />", {text : 'click here',
                on   : {
                    click : function() {
                        foo(item);
                    }
                }
    }).appendTo('#sometag');
});

function foo(val) {
    console.log(val);
}
Run Code Online (Sandbox Code Playgroud)