2012-08-23 94 views
3

在我的一些Javascript對象中,我發現我的this指針是正確的 - 這些是new Func()-類型對象 - 創建時,但在指定的方法中它可能是錯誤的。Javascript` this` object ==`window`` in member function

function Confused() { 
    console.log("checking",this==window,"is always false"); 
    this.method = function() { 
     console.log("checking",this==window,"is true for some funcs but not others"); 
    }; 
}; 

在某些調用(new Confused()).method() - 它似乎已經失去了它的this指針。這種情況發生的時間似乎取決於功能,而不是隨機的;它在代碼中圍繞着如何創建導致此問題的類。

一個例子是在線http://williame.github.com/barebones.js/和成員回調G3D._file_loaded有時錯誤this指針有時被調用時。

爲什麼,我該如何解決?

+0

[本文](http://www.quirksmode.org/js/this.html)是否回答你的問題? – Znarkus

+1

'this'的值由每個函數調用的特定情況決定。不要緊,一個函數最初被定義爲某個對象的屬性的值 - 它根本不關心**。重要的是函數的調用方式,就是這樣。 – Pointy

回答

6

有4種方法在JavaScript中使用 功能每一種也就是改變什麼this的內容是:

  • 函數調用: this =全局對象(瀏覽器中的窗口)
  • 方法調用:this = this被調用的對象。
  • 構造函數調用:this =你正在創建的新對象。
  • 呼叫/應用呼叫:this =您通過的對象。

在你的情況this == window當您直接撥打電話(Confused())的功能,但如果你調用使用新(new Confused()),那麼這將是你所創建的新對象。

+0

這是讓我明白的答案。我的代碼將該方法作爲回調函數傳遞給另一個函數。我真的不喜歡學習Javascript;它似乎在每個回合都有這樣奇怪的,毫無意義的陷阱。好吧。 – Will

4

this關鍵字指的是調用上下文。它從來不是錯誤但它可能不是你所期望的。

如果調用函數.call.apply,則可以在調用函數時手動設置上下文。

此外,如果您想要參考window,爲什麼不使用window而不是this?這是一種訪問窗口對象的更可靠的方法。

2

除了大衛Hedlunds解釋,你可以「解決」這個問題是這樣的:

function Confused() { 
    var that = this; 
    console.log("checking",that==window,"is always false"); 
    this.method = function() { 
     console.log("checking",that==window,"is always false"); 
    }; 
}; 

的問題是,誰實際上調用你的函數有超過你的函數的上下文控制。如果你不控制函數調用(也就是說,如果你不能修改代碼),那麼你會堅持使用我給出的解決方案(至少我沒有其他辦法)。

儘管解決方案看起來有點「駭人聽聞」,但如果您仔細想想,這種方法實際上並非如此。它只是簡單地駕馭通過關閉給你的權力:d

+0

這是我鏈接的代碼中的解決方法。我對此感到不滿。 – Will

相關問題