我认为您想要的是弱绑定:
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
callfunc2
会 call func
which 会call 更好someuser.func
。但是使用bind
,调用func2
将直接调用someuser.func
。