如何在闭包中保留变量的值

时间:2011-01-09 15:21:21

标签: closures javascript

我需要创建多个内部具有静态 id 的javascript函数,因此函数本身知道要处理的数据。

以下是一些代码:

(function(){
  function log(s){
    if(console && console.log) console.log(s);
    else alert(s);
  }
  var i = 10; while (i--){
    window.setTimeout(function(){
      // i need i to be 10, 9, 8... here not -1
      log(i);
    },500);
  }
})();

问题是 i 总是被循环更新,我需要阻止它。

预先感谢您提供任何帮助,意见或建议!

3 个答案:

答案 0 :(得分:3)

只需创建一个函数并调用它。

while (i--) {
    (function(i) {
        // use i here
    })(i);
}

答案 1 :(得分:3)

(function(){
  function log(s){
    if(console && console.log) console.log(s);
    else alert(s);
  }
  var i = 10; while (i--){

    (function() { // start anon func

      var copy = i; // copy loop variable

      window.setTimeout(function(){
        log(copy); // refer to copy
      },500);

    })(); // end anon func and call it immediately
  }
})();

答案 2 :(得分:2)

在每次迭代中使用立即调用的函数的一种更好的方法是让log()函数返回一个函数。

(function(){
  function log(s){
    return function() {
        if(console && console.log) console.log(s);
        else alert(s);
    };
  }
  var i = 10; while (i--){
    window.setTimeout( log( i ),500 );
  }
})();

总体结果是你最终构造了更少的函数对象。

如果您希望呼叫间隔时间,请使用setInterval()或更改此设置:

window.setTimeout( log( i ), 500 );

到此:

window.setTimeout( log( i ), i * 500 );