在下面的代碼中,當調用func2b時,'this'是DOMWindow,而不是對obj2的引用。爲什麼func2b放棄它作爲'this'引用obj2?JavaScript回調返回DOMWindow
這裏有一個的jsfiddle版本:http://jsfiddle.net/qqzKh/
var obj1 = {
init: function() {
this.prefix = "Stop!";
obj2.func2a(this.func1a);
}
,func1a: function(message) {
console.log(this.prefix + " " + message);
}
};
var obj2 = {
func2a: function(callback) {
this.callback = callback;
console.log(this.callback); // Correct reference to obj1.func1a
obj3.func3a(this.func2b);
}
,func2b: function(message) {
console.log(this); // Unexpectedly returns DOMWindow
this.callback(message);
}
};
var obj3 = {
func3a: function(callback) {
callback("Hammer Time.");
}
}
obj1.init();
SOLUTION
var obj1 = {
init: function() {
this.prefix = "Stop!";
obj2.func2a(this, this.func1a);
}
,func1a: function(message) {
console.log(this.prefix + " " + message);
}
};
var obj2 = {
func2a: function(owner, callback) {
this.owner = owner;
this.callback = callback;
obj3.func3a(this, this.func2b);
}
,func2b: function(message) {
this.callback.call(this.owner, message);
}
};
var obj3 = {
func3a: function(owner, callback) {
callback.call(owner, "Hammer Time.");
}
}
obj1.init();
函數沒有被綁定,「this」引用的內容取決於函數被調用的方式。閱讀[關於'this'的MDN文檔](https://developer.mozilla.org/en/JavaScript/Reference/Operators/this)。 –
,因爲'this'綁定是基於每個調用的,並且取決於函數的調用方式,而不是函數的存儲位置。如果您以非嚴格模式直接調用函數('fun()'),它將始終是瀏覽器中的'window'。 – Esailija
感謝您的鏈接@FelixKling。不太確定,但我需要在我的例子中改變這個工作,但我會繼續閱讀。 – scader