我运行以下JS脚本,但只找到func2()
输出foobar
,而不是George
,谁可以解释为什么func2 = func.bind(someuser)
不绑定someuser
到func
?
var someuser = {
name: 'George',
func: function () {
console.log(this.name);
}
};
var foo = {
name: 'foobar'
};
func = someuser.func.bind(foo);
func(); // output foobar
func2 = func.bind(someuser);
func2(); //output foobar
答案 0 :(得分:4)
来自MDN:
bind()函数创建一个新函数(一个绑定函数),它具有相同的函数体(ECMAScript 5术语中的内部调用属性),因为它被调用的函数(绑定函数的目标函数)具有此值绑定到bind()的第一个参数,无法覆盖。
基本上这意味着你不能在已经绑定的函数上调用bind。
在您的示例中,您必须执行以下操作:
func2 = someuser.func.bind(someuser);
答案 1 :(得分:2)
我认为你想要的是一个弱约束:
function weakBind(functable, context) {
var GLOBAL = this;
return function () {
return functable.apply(this === GLOBAL ? context : this, arguments);
};
}
现在你可以这样做:
var someuser = {
name: 'George',
func: function () {
console.log(this.name);
}
};
var foo = {
name: 'foobar'
};
var func = weakBind(someuser.func, foo);
func(); // output foobar
var func2 = weakBind(func, someuser);
func2(); //output George
请参阅演示:http://jsfiddle.net/R79EG/
正常绑定的问题是,一旦将对象绑定到this
指针,就无法覆盖它。弱绑定检查this
指针是否设置为GLOBAL
对象(在这种情况下使用默认值)。否则它会使用新的this
指向的任何内容。
var someuser = {
name: 'George',
func: function () {
console.log(this.name);
}
};
var foo = {
name: 'foobar'
};
var func = someuser.func.bind(foo);
func(); // output foobar
var func2 = someuser.func.bind(someuser);
func2(); //output George
这比weakBind
好,因为调用func2
会调用func
,而someuser.func
会调用bind
。无论使用func2
,调用someuser.func
都会直接调用{{1}}。
答案 2 :(得分:0)
您已绑定someuser.func
。
您可能希望以不同方式设置脚本。
或使用:
func = someuser.func.bind(foo);
func(); // output foobar
func2 = someuser.func.bind(someuser);
func2(); //output foobar
请勿尝试重新绑定已绑定的功能。