[英]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 == 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.