我想你想要的是一个弱绑定:
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
指向。
BTW你的情况,它只是更好地做到这一点,而不是:
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
。
也许是因为它已经被绑定了? – Shawn31313
我没有得到你的问题 – Qchmqs
@ Shawn31313你应该张贴作为答案btw。 –