如果我打开一个空白页,我运行下面的命令,在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