问一个关于Javascript中bind函数在Nodejs中的问题
问一个关于Javascript中bind函数在Nodejs中的问题
先上代码
var foo = {
message: 'Foooooooo'
};
var bar = {
message: 'Barrrrrrr'
};
function say() {
console.log(this.message);
}
say();
say.bind(foo)();
say.bind(foo).bind(bar)();
say.bind(foo).apply(bar);
// 执行之后如下
// undefined
// Foooooooo
// Foooooooo
// Foooooooo
我的问题是:为什么bind(foo)之后,不管是再bind其它对象,还是用apply改变this对象,都无法影响调用结果?
我个人理解为应该按最后bind或apply的this来调用才对啊。
3 回复
Function.prototype.bind = function (ctx) {
var args = Array.prototype.slice.call(arguments, 1);
return function () {
return this.apply(ctx, args.concat(arguments));
};
};
在你的例子中,bind()
函数创建了一个新的函数,这个新函数会在调用时绑定到特定的对象。具体来说:
say.bind(foo)();
这一行将say
函数绑定到了foo
对象,所以输出了"Foooooooo"
。say.bind(foo).bind(bar)();
这里say.bind(foo)
创建了一个新的函数,然后再次调用.bind(bar)
又生成了一个新的函数。由于bind
是不可逆的,第一次绑定已经固定了this
的值为foo
,因此第二次绑定bar
没有任何效果。最终还是输出了"Foooooooo"
。say.bind(foo).apply(bar);
这里使用apply
方法改变了this
上下文,但由于say.bind(foo)
已经绑定了foo
,所以这里的apply
并不会改变this
的绑定关系。你可以通过将apply
放在bind
调用链的末尾来改变this
的上下文。
为了达到你预期的效果,可以这样做:
var foo = {
message: 'Foooooooo'
};
var bar = {
message: 'Barrrrrrr'
};
function say() {
console.log(this.message);
}
var boundSay = say.bind(foo);
boundSay.apply(bar); // 输出 "Barrrrrrr"
这样,boundSay.apply(bar)
就会输出 "Barrrrrrr"
,因为 apply
直接改变了 this
的上下文。