【问题标题】:Javascript Function.prototype.bind() with inline object definition带有内联对象定义的 Javascript Function.prototype.bind()
【发布时间】:2017-08-28 17:51:28
【问题描述】:

在使用 bind() 函数时,我遇到了一种我目前不知道的情况。 有人可以给我解释一下为什么这个例子是这样工作的吗? 显然,传递给绑定函数的内联对象仅在第一次迭代中初始化,然后保留引用。 我找不到有关此的任何文档,如果您能指出正确的方向,我将不胜感激:-)

class test {

 addLetter(element) {
  console.log('addLetter', this.str);
  this.str += element + ',';
 }

 foo() {
  let arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];

  arr.forEach(this.addLetter.bind({
   str: ''
  }));
 }
}

let a = new test();
a.foo();

OUTPUT:
addLetter 
addLetter a,
addLetter a,b,
addLetter a,b,c,
addLetter a,b,c,d,
addLetter a,b,c,d,e,
addLetter a,b,c,d,e,f,

【问题讨论】:

  • 你的代码可以解构为let cb = this.addLetter.bind({...}); arr.forEach(cb);。 – 是的,您只使用一个绑定对象创建 one 回调。
  • 确实,我的错误是将 forEach 视为正常循环,谢谢。

标签: javascript function.prototype


【解决方案1】:

如果您将参数与函数调用分开,则更容易查看。像这样的函数调用:

someFunc(<expression>);

相当于:

var tempVar = <expression>;
someFunc(tempVar);

所以在你的情况下,它是这样的:

var tempVar = this.addLetter.bind({
   str: ''
});
arr.forEach(tempVar);

这清楚地表明,当我们设置tempVar 时,我们只调用了一次bind()。它创建一个绑定到特定对象的函数。然后forEach 重复调用该函数。我们可以进一步分解为:

var tempObj = { str: '' };
var tempFun = this.addLetter.bind(tempObj);
arr.forEach(tempFun);

现在应该很清楚为什么每次调用函数时只有一个对象会被重用。

【讨论】:

  • 非常感谢,解构它真的很容易理解:)
【解决方案2】:

.bind() 的第一个参数是上下文。在这种情况下,它是

{
    str: ''
}

现在,您正在引用它并在其中使用其str 属性。现在,我们知道.bind() 返回一个函数。该函数恰好在.forEach() 中调用。

这个bind generated function 接收一个元素作为它的第一个参数(取决于迭代)。

第一次迭代索引为零,bind generated function 函数接收 'a' 作为其参数。

声明

this.str += element + ',';

将 str 增强为'' + 'a'。在第二次迭代中,参数是 'b' 并附加到 'a,' + 'b' 等等。

因此您会看到您看到的结果。让我知道这是否可以澄清您的问题。

【讨论】:

  • 为什么bind在所有迭代中都传递同一个匿名对象,但每次迭代都没有创建一个对象?
  • 这是个好问题。因此,绑定的是对匿名对象的引用,并且在循环中您碰巧只更改了它的str 属性。每次循环迭代都不会创建新对象,这就是为什么同一对象的 str 属性会继续增长(通过串联)。
  • @Dmitry 因为bind 不知道任何循环。它只绑定对象一次,因为它只被调用一次。
  • 啊,现在我明白了。我认为forEach 是一个正常的循环,这让我很困惑。
  • 我也是,我没有将其视为回调,我只是将其视为循环内的正常执行/:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
  • 2011-08-03
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多