2012-05-30 67 views
0

在下面的代碼中,當調用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(); 

+2

函數沒有被綁定,「this」引用的內容取決於函數被調用的方式。閱讀[關於'this'的MDN文檔](https://developer.mozilla.org/en/JavaScript/Reference/Operators/this)。 –

+0

,因爲'this'綁定是基於每個調用的,並且取決於函數的調用方式,而不是函數的存儲位置。如果您以非嚴格模式直接調用函數('fun()'),它將始終是瀏覽器中的'window'。 – Esailija

+0

感謝您的鏈接@FelixKling。不太確定,但我需要在我的例子中改變這個工作,但我會繼續閱讀。 – scader

回答

1

如果你這樣做:

a.f() 

然後a在f的主體中被稱爲'this'。

如果你這樣做:

f() 

則窗口在f的機構,稱爲 '本'。

編輯:爲Esailija說:

你使用的回調( 「哈默時刻。」)像F()被調用這個答案。

+0

這在理論上很有意義,但是這怎麼轉化爲我的例子呢? – scader

+1

@scader在這個答案中調用了'callback(「Hammer Time。」)''如'f()'。您不會將'callback'作爲任何對象的屬性調用,如'lol.callback()'。注意,你並不需要這個函數是某個對象的屬性來獲得你想要的東西,你也可以說'callback.call(lol,「HAmmer time」)''它將明確地將'this'綁定到'lol'爲了通話。或者在你的例子中'callback.call(obj2,「Hammer Time。」)' – Esailija

+0

那麼說@Esailija。 –