2017-08-28 37 views
0

当我使用bind()函数时,遇到了我目前不知道的情况。 有人可以给我和解释为什么这个例子是这样的吗? 显然,传递给绑定函数的内联对象仅在第一次迭代中初始化,然后保留引用。 我是不是能够找到的有关这个的任何文件,如果你可以点我朝着正确的方向我会:-)使用内联对象定义的Javascript Function.prototype.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, 
+0

可能的重复[如何“this”关键字工作?](https://stackoverflow.com/questions/3127429/how-does-the-this-keyword-work) – Erazihel

+1

您的代码可以被解构为'让cb = this.addLetter.bind({...}); arr.forEach(CB);'。 - 是的,你只会创建一个*一个绑定对象的回调。 – deceze

+0

事实上,我的错误是考虑forEach作为一个正常的循环,谢谢。 –

回答

1

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

someFunc(<expression>); 

等同于:

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

所以你的情况,是这样的:

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

这使得clearthat我们只调用bind()一次,当我们设置tempVar。它创建一个绑定到特定对象的函数。然后forEach反复调用该函数。我们可以进一步将其分解为:

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

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

+0

非常感谢,解构它真的使它很容易理解:) –

1

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

{ 
    str: '' 
} 

现在,你引用它,并使用内的str财产。现在,我们知道.bind()返回一个函数。该功能恰好在.forEach()之内调用。

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

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

声明

this.str += element + ','; 

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

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

+0

为什么'bind'在所有迭代中传递相同的匿名对象,但不会为每次迭代创建一个对象? – Dmitry

+0

这是一个很好的问题。所以,绑定是一个对匿名对象的引用,在循环中,你只是改变其'str'属性。每个循环迭代都没有创建新对象,这就是为什么同一对象的'str'属性继续增长(通过串联)的原因。 – 82Tuskers

+0

@Dmitry因为'bind'不知道任何循环。它只绑定一次对象,因为它只被调用一次。 – deceze

相关问题