带有内联对象定义的Javascript函数.prototype.bind()

带有内联对象定义的Javascript函数.prototype.bind(),javascript,function.prototype,Javascript,Function.prototype,当我使用bind()函数时,我遇到了一个我目前不知道的情况。 有人能给我解释一下为什么这个例子是这样的吗? 显然,传递给bind函数的内联对象仅在第一次迭代中初始化,然后保留引用。 我找不到任何关于此的文档,如果您能为我指出正确的方向,我将非常感激:-) .bind()的第一个参数是上下文。在这种情况下,它是 { str: '' } 现在,您正在引用它并在中使用它的str属性。现在,我们知道.bind()返回一个函数。该函数恰好在.forEach()中调用 这个bind生成的函数接收一

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


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

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

这个
bind生成的函数
接收一个元素作为其第一个参数(取决于迭代)

迭代索引第一次为零,并且
bind生成的函数
函数接收“a”作为其参数

声明

this.str += element + ',';
将str增强为
'+'a'
。在第二次迭代中,参数是'b',它被附加到
'a',+'b'
等等


因此,你看到了你看到的结果。如果这能澄清你的问题,请告诉我

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

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

这个
bind生成的函数
接收一个元素作为其第一个参数(取决于迭代)

迭代索引第一次为零,并且
bind生成的函数
函数接收“a”作为其参数

声明

this.str += element + ',';
将str增强为
'+'a'
。在第二次迭代中,参数是'b',它被附加到
'a',+'b'
等等


因此,你看到了你看到的结果。如果这能澄清你的问题,请告诉我

如果将参数与函数调用分开,则更容易看到。函数调用,如:

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

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

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

如果将参数与函数调用分开,则更容易看出。函数调用,如:

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

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

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

可能重复的代码可以解构为
let cb=this.addLetter.bind({…});arr.forEach(cb)–是的,您只使用一个绑定对象创建了一个回调。事实上,我的错误是将forEach视为一个普通循环,谢谢。您的代码的可能副本可以解构为
let cb=this.addLetter.bind({…});arr.forEach(cb)–是的,您只使用一个绑定对象创建了一个回调。事实上,我的错误是将forEach视为正常循环,谢谢。为什么
bind
在所有迭代中传递相同的匿名对象,但不为每个迭代创建对象?这是一个好问题。因此,绑定的是对匿名对象的引用,在循环中,您恰好只更改了它的
str
属性。每次循环迭代都没有创建新对象,这就是同一对象的
str
属性继续增长(通过串联)的原因。@Dmitry因为
bind
不知道任何循环。它只绑定对象一次,因为它只被调用一次。啊,现在我明白了。我把
forEach
看作是一个普通的循环,这让我很困惑。我也是,没有把它当作一个回调,我只是把它看作是循环中的一个正常执行/:)为什么
bind
在所有迭代中都传递相同的匿名对象,但没有为每个迭代创建一个对象?这是一个好问题。因此,绑定的是对匿名对象的引用,在循环中,您恰好只更改了它的
str
属性。每次循环迭代都没有创建新对象,这就是同一对象的
str
属性继续增长(通过串联)的原因。@Dmitry因为
bind
不知道任何循环。它只绑定对象一次,因为它只被调用一次。啊,现在我明白了。我把
forEach
看作是一个正常的循环,这让我很困惑。我也是,没有把它当作回调,我只是把它看作是循环中的一个正常执行/:)非常感谢,解构它真的很容易理解:)非常感谢,解构它确实使它非常容易理解:)