的原因,您原來的代碼不工作是,this
方法調用內部的價值是它被稱爲對對象的值。這意味着,當你說:
bar.callback = foo.callback;
然後調用:
bar.callback();
這裏定義的代碼:
Foo.prototype.callback = function() {
console.log(this);
};
被稱爲與this
其事bar
一個參考,因爲bar
是方法調用的.
的左側。所以,無論何時將一個函數指定爲對象屬性,在該對象上調用該函數都會將其作爲對象調用this
。
你還可以這樣寫:
function callback() {
console.log(this);
}
bar.callback = callback;
bar.callback();
而且你會發現,this
仍然引用bar
。實際上,如果您調用上面定義的普通函數callback();
,則會發現this
是對全局對象的引用,通常是網頁瀏覽器中的window
。這是因爲所有的全局變量和函數的window
性質,所以callback();
是隱含window.callback();
說的this
的價值取決於什麼對象調用函數繞過回調時可能會出現問題的事實,因爲有時你想this
來引用該函數是一個屬性的原始對象。綁定方法是設計來解決這個問題,和Yuri Sulyma給出了正確的答案:
bar.callback = foo.callback.bind(foo);
但是,你會做到這一點使用閉包的方式是調用正確的匿名函數中捕獲的Foo實例方法正確的對象:
foo = new Foo();
bar = new Bar();
bar.callback = function() {
foo.callback();
};
bar.onSomeAction();
這基本上是什麼綁定。事實上,我們所說的用一個封閉寫我們自己綁定的幼稚版本:
Function.prototype.bind = function (obj) {
var fn = this;
return function() {
fn.call(obj);
};
};
call
讓我們調用一個函數明確定義的this
值。這允許您在「設置上下文」中調用該功能,以便當您致電bar.callback()
時調用obj.fn()
。因爲當我們呼叫foo.callback.bind(foo);
時,obj
是foo
而fn
是foo.callback
,結果是呼叫bar.callback()
變得與呼叫foo.callback()
相同。
這就是Dalorzo的答案來自何處。他使用call
來顯式設置上下文。
還有另一個函數用於設置名爲apply
的上下文,該函數還將表示函數參數的數組作爲第二個參數。這使我們能夠利用特殊的arguments
變量編寫更完整版本的綁定:
Function.prototype.bind = function (obj) {
var fn = this;
return function() {
fn.apply(obj, arguments);
};
};
不綁定依賴調用還是應用? – Dalorzo