我想你想要的是一個弱綁定:
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。 –