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

发布于 2024-10-10 18:42:33 字数 426 浏览 3 评论 0原文

我需要创建多个内部有静态 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 总是通过循环更新,我需要防止这种情况。

预先感谢您的任何帮助、评论或提示!

i need to create multiple javascript functions which have a static id inside, so the function itself knows what data to process.

Here is some code:

(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);
  }
})();

The problem ist that i allways gets updated by the loop, and i need to prevent this.

Thanks in advance for any help, comments or tips!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

故乡的云 2024-10-17 18:42:34

在每次迭代中使用立即调用函数的更好方法是让 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 );

A little better approach to using an immediately invoked function in each iteration, is to have your log() function return a function.

(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 );
  }
})();

The overall result is that you end up constructing fewer function objects.

If you wanted the calls to be at an interval, either use setInterval(), or change this:

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

to this:

window.setTimeout( log( i ), i * 500 );
撩人痒 2024-10-17 18:42:33

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

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

Just create a function and call it.

while (i--) {
    (function(i) {
        // use i here
    })(i);
}
路弥 2024-10-17 18:42:33
(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
  }
})();
(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
  }
})();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文