如果我打開一個空白頁,我運行下面的命令,在JavaScript控制檯我得到了相同的結果:是什麼這之間的差異,自我,窗口和window.self
>>> this
DOMWindow
>>> self
DOMWindow
>>> window
DOMWindow
>>> window.self
DOMWindow
它們是指什麼? ...相同的對象還是其他什麼?
如果我打開一個空白頁,我運行下面的命令,在JavaScript控制檯我得到了相同的結果:是什麼這之間的差異,自我,窗口和window.self
>>> this
DOMWindow
>>> self
DOMWindow
>>> window
DOMWindow
>>> window.self
DOMWindow
它們是指什麼? ...相同的對象還是其他什麼?
window
是腳本執行的當前瀏覽器窗口的引用。window.self
顯然是其自身的自我引用。而且由於self
這裏是全局對象window
的一個屬性,所以它也可以被訪問,就像它本身是一個「全局」變量一樣:只是self
。
所以最後三個在大多數情況下確實是一回事。
this
但是完全不同:它是一個指向當前範圍的變量。如果您在控制檯中執行以下代碼:
> var myPackage = {}
> myPackage.method = function() {console.log(this)}
> myPackage.method()
this
將指向myPackage
對象(的method
範圍內)。
this
DOMWindow
this
總是實際的上下文JavaScript表達式被稱爲中。所以你的情況其在全球範圍內,這是window對象,當你在瀏覽器中運行它。注意在nodeJs中運行相同的結果會給你另一個結果。
self
//DOMWindow
返回對象參照窗口對象。
window
// DOMWindow
它你叫什麼:window對象。
window.self
//DOMWindow
它和上面調用自己一樣導致你的上下文是窗口。因此,在全球範圍內調用window.self
或self
或this.self
時是相同的。
總是這個關鍵字引用它被調用的上下文。但是即使在改變上下文之後,self和window也指向Window本身。
// Log function
function logAll(){
console.log("this >", this);
console.log("self >", self);
console.log("window >", window);
console.log("window.self >", window.self);
console.log("this.self >", this.self);
};
// Class Car
function Car(){
this.self = 6;
};
// Instance of Car
var honda = new Car();
honda.self = 5;
// logAll() called in context Gloabal
logAll();
// Outputs
this > Window
self > Window
window > Window
window.self > Window
this.self > Window
// logAll() called in context honda
logAll.call(honda);
// Outputs
this > Car { self= 5 }
self > Window
window > Window
window.self > Window
this.self > 5
在這裏你可以看到當全球範圍內被稱爲this.self回報窗口,因爲在全球範圍內
this = windows
this.self = windows.self
this.self = Windows
但是當你在本田汽車的一個實例的上下文:
this = honda
this.self = honda.self
this.self = 5
在使用OOP和繼承時,上下文在Javascript中扮演着重要的角色。
+1,但僅僅是迂腐,'self'和'window'都是對javascript全局對象的引用,它包含'self'和'window'兩個屬性(都指向它自己)。這意味着沒有「好像」 - 「window」與「self」屬性一樣多,而「self」是「window」的屬性。並且添加一些(稍微)不那麼迂腐的東西:所有這些(除'this' ... ;-))僅僅是ECMA/Javascript在瀏覽器中給出的。 'window'和'self'都不是語言本身的一部分,並且可能不會出現在ECMA/Javascript的其他用途中。 – JimmiTh 2012-02-09 21:12:03
在IE中,「窗口」是......特別的。對於所有實際的目的,'window','self'和'window.self'(和在某些情況下的'this')仍然是等價的,但是*嚴格的相等運算符說它是一個不同的對象。在全局範圍內,所有這些表達式在IE中評估爲true:'window === this','window!== self','window!== window.window','window!== window.self '。 == ==運算符說它們都是平等的。 – 2012-02-09 22:16:45