for ( ... ) { var v; ... v = ... ; xxx.click(function() { ... var a = v; // v 是引用,因此事件函数实际执行的时候v总是用的循环结束后的最后一个值。 ... }); }
for ( ... ) { var v; ... v = ... ; xxx.click(function(v){ return function() { ... var a = v; ... })} (v); //通过这个立即的函数调用,事件函数中的v成为了循环的当前值。
}
我花了二十分钟小时摸索到了这个方法,然后到stackoverflow查看了一下,从这个帖子http://stackoverflow.com/questions/1413916/javascript-closure-immediate-evaluigzation可以看到,这个问题是比较普遍的,而这个解决方案最清晰简单,可读性好,也是很实用的。
在coffescript中,因为coffescript编译到javascript,其闭包采用了同样的语义,因此也有同样的问题。以下是解决方法:
for ... v = ... xxx.click (v) -> -> ... a = v ... (v)
利用其do语法,有更漂亮的写法。
for ... v = ... xxx.click do(v = v) -> -> ... a = v ...