在下面的绑定片段中
function foo(something) {
this.a = something;
}
var obj1 = {};
var bar = foo.bind( obj1 );
bar( 2 );
console.log( obj1.a ); // 2
var baz = new bar( 5 );
console.log( obj1.a ); // 2
console.log( baz.a ); // 5
在此步骤var bar = foo.bind( obj1 );
中,我们将obj1
绑定到foo
函数中。
执行bar(2)
后,obj1
的值为2。
是否想知道bar(2)
触发了什么?
我的假设
由于bar
被分配给foo
并与obj1
绑定,因此调用bar(2)
可能已经分配了this.a = 2
并将该值保留在{{1}中}(即obj1 = {a:2})。
我的假设正确吗?
感谢您的帮助。
答案 0 :(得分:2)
这里bind(obj1)
的工作方式就像您将scope
foo
的默认function
覆盖为obj1
一样,因此this
关键字被替换为空白对象( obj1
中的foo
)。
function foo(something) {
//this = {} (obj1);
//this.a == obj.a
this.a = something;
}
var obj1 = {};
var bar = foo.bind(obj1);
答案 1 :(得分:2)
在函数上调用bind()
将返回一个新的绑定函数。当您调用此绑定函数时,它将以您传入的上下文作为第一个参数执行原始函数。因此,this
中的foo
会在通过绑定函数调用时指向obj1
。
答案 2 :(得分:2)
要了解这一点,您需要首先使用.bind做什么?
bind是一个函数,它返回另一个称为bound的函数。
function x (){
console.log(this.item)
}
考虑以上代码,对item
是什么一无所知。
var obj = { item : 10};
考虑此对象,该对象确实知道其item属性。
在x
对象(该函数)上调用.bind时,它将返回该函数的相同副本(称为 bound ),但具有obj {item: 10}
的上下文。
var bound = x.bind(obj);
该特定语句说,在obj的上下文中赋予该特定功能。
现在,如果我们调用bound()
,它将打印10
答案 3 :(得分:0)
您的假设是正确的。
var bar = foo.bind( obj1 );
使bar成为foo对象的引用。因此,您现在可以通过bar访问该功能。
bar( 12 );
如果您呼叫console.log()
,依此类推,将打印12。