【问题标题】:Binding a variable at time of passing callback [duplicate]在传递回调时绑定变量[重复]
【发布时间】:2018-10-08 20:21:08
【问题描述】:

在将回调函数传递给调用者时如何绑定(或传递值)到回调?

例如:

function callbackTest() {
    for(i=0; i<3; i++){
       setTimeout(function(){
            console.log("Iteration number ", i); 
        }.bind(i), i*1000);
    }
}

callbackTest();

结果:

$ node callback-with-bind.js
Iteration number  3
Iteration number  3
Iteration number  3

我希望绑定在回调传递给调用者时发生。但是没有。

我该怎么做?

在我的实际应用程序中,调用者将另一个参数传递给我的回调,所以我不能简单地将 i 作为参数传递。

function callbackTest() {
    for(i=0; i<3; i++){
        setTimeout(function(myParam){
            console.log("Iteration number ", i);
        }.bind(i), i*1000);
    }
}

callbackTest();

【问题讨论】:

  • Bind 从另一个函数创建一个函数,其中一些参数用特定值填充。您的函数不接受任何参数,因此使用 bind 没有任何意义
  • 您的方法不需要那个绑定,只需使用 IIFE 来传递变量 i
  • @charlietfl,如你所说。虽然我无法找到更早的答案。链接?
  • 嗯?不知道你在问什么。如果要查找重复链接,则它位于系统放置的页面顶部

标签: javascript binding callback


【解决方案1】:

bind,当提供单个参数时,设置函数的 this - 在您的示例中,函数内部的 i 根本没有被绑定或更改 - 它仍然只是使用(全局)@987654324 @。您应该使用 bindsecond 参数,该参数分配给函数的第一个参数,并为您的函数提供适当的第一个参数,以便可以使用它:

function callbackTest() {
    for(i=0; i<3; i++){
       setTimeout(function(internalI){
            console.log("Iteration number ", internalI); 
        }.bind(null, i), i*1000);
    }
}

callbackTest();

也可以完全不使用任何参数并继续使用bind(i),但是您必须在函数中将i 替换为this,这通常不是那种this 应该参考的东西:

function callbackTest() {
    for(i=0; i<3; i++){
       setTimeout(function(){
            console.log("Iteration number " + this); 
        }.bind(i), i*1000);
    }
}

callbackTest();

或者,您可以将i 声明为let,它具有块作用域,而不是全局作用域或函数作用域:

function callbackTest() {
  for (let i = 0; i < 3; i++) {
    setTimeout(function() {
      console.log("Iteration number ", i);
    }, i * 1000);
  }
}

callbackTest();

【讨论】:

  • 或者他可以在函数内部使用this,而不是i
  • 在这个例子中,绑定i有什么意义呢?
  • 绑定是完全没有必要的,相反,传递变量i并返回函数的IIFE更合适。
  • 另外,在我的实际应用中,调用者传递了自己的参数,我无法传递 internalI
  • @WesModes let(或const绝对是更可取的方法,因为它最清晰、最简单——如果你需要支持古老的浏览器,那么首先是 Babel。 (如果您正在半专业地开发某些东西,Babel 可能已经是您构建过程的一部分)另一个不错的选择是避免 for 循环完全使用数组方法,这将自动为您提供函数范围。
猜你喜欢
  • 2017-04-04
  • 2014-04-30
  • 1970-01-01
  • 2020-09-02
  • 2011-11-13
  • 1970-01-01
  • 2011-03-13
  • 2013-03-22
  • 1970-01-01
相关资源
最近更新 更多