javascript的闭包中保存的是引用与循环中事件函数处理

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
                    ...
原文地址:https://www.cnblogs.com/chaosim/p/3056009.html