簡體   English   中英

成員函數中的Javascript`this`object ==`window`

[英]Javascript `this` object == `window` in member function

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

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指針有時也被稱為時。

為什么,我該如何解決?

有4種方法在JavaScript中使用的函數每個這些確實是什么改變了什么內容this就是:

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

在你的情況下, this == window直接調用函數( Confused() ),但如果你使用new( new Confused() )調用,那么它將是你正在創建的新對象。

this關鍵字引用調用上下文。 它永遠不會錯,但它可能不是你所期望的那樣。

調用函數時,您可以手動設置背景下,如果你把它.call.apply

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

除了David 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");
   };
};

問題在於,實際調用函數的人可以控制函數的上下文。 如果你不控制函數調用(也就是說,如果你不能修改代碼),那么你會堅持使用我給出的解決方案(至少我不知道其他方式)。

雖然解決方案看起來有點“hackish”,但如果你想一想,它真的不是。 它只是利用閉包給你的力量:D

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM