【问题标题】:Pass a value to callback in nodejs [duplicate]将值传递给nodejs中的回调[重复]
【发布时间】:2012-09-23 04:12:54
【问题描述】:

可能重复:
Javascript closure inside loops - simple practical example

for (i = 0; i < 100; i++) {
    setTimeout(function() {
        console.log(i);
    }, 500)
}

在上面的代码中,它只会打印 100。我知道原因。但是如何将当前的 i 值发送到setTimeout 中的回调?

【问题讨论】:

    标签: javascript node.js asynchronous


    【解决方案1】:

    在循环中使用匿名函数来创建闭包:

    for (i = 0; i < 100; i++) {
    
      (function(i){
    
        window.setTimeout(function() {
          console.log(i);
        }, 500)
    
      })(i);
    
    }
    

    当您在调用时将值传递给函数时,该值将被复制,并且函数的每个实例都有自己的副本,当循环计数器更改时不会更改。

    【讨论】:

    • Nit:OP 使用的原始回调 (function() { console.log(i); }) 已经是一个闭包。您基本上是在说“使用闭包而不是闭包”。重要的一点是您正在立即执行该函数,从而创建一个新范围。
    • @FelixKling:该捕获捕获循环变量而不是复制它,因此您需要另一个闭包,而不是闭包而不是闭包。
    • 好吧,你不是在说这个,但对我来说听起来是这样的。但是不,从技术上讲,您不需要另一个闭包,您需要一个新的范围(在 JS 中是函数调用)来捕获变量的当前值。正如我所说,这都是吹毛求疵,但将立即执行的函数仅称为“闭包”是不正确的。这不是该构造的主要特征,创建一个新范围才是。如果 JavaScript 对闭包有不同的语法(如 PHP,而不是“普通”函数),那么差异会更加明显。
    【解决方案2】:

    setTimeout accepts parameters that are passed to the callback

    for (i=0;i<100;i++){
        setTimeout(function(i){
            console.log(i);
        },500, i)
    }
    

    【讨论】:

    • bt 如果它有其他回调怎么办。 (setTimeout 就是一个例子)。默认情况下已经有一些参数的任何通用回调。
    • 如果您不能这样做,请使用旧的闭包解决方案(请参阅所有其他答案)。
    • @Guffa 这是node.js,不是IE
    • 由于 setTimeout 不是 ES 的一部分,并且 node.js 与 Mozilla 无关,所以最好链接到 node.js 文档:nodejs.org/api/timers.html
    • @dystroy:对。让我一头雾水。
    【解决方案3】:

    这行得通:

    for (var i = 0; i < 100; i++) {
        (function(i) {
            setTimeout(function() {
                console.log(i);
            }, 500);
        })(i);
    }​
    

    【讨论】:

      【解决方案4】:
      for (i = 0; i < 100; i++) {
          setTimeout((function(i) {
              return function(){
                  console.log(i);
              }
          })(i), 500)
      }
      

      【讨论】:

        猜你喜欢
        • 2017-01-26
        • 2017-06-30
        • 1970-01-01
        • 1970-01-01
        • 2018-03-01
        • 2017-01-18
        • 2015-05-17
        • 1970-01-01
        • 2012-08-17
        相关资源
        最近更新 更多