如果我打开一个空页面并在javascript控制台中运行以下命令,我会得到相同的结果:
>>> this
DOMWindow
>>> self
DOMWindow
>>> window
DOMWindow
>>> window.self
DOMWindow
他们指的是什么? ......同一个对象还是其他什么?
答案 0 :(得分:8)
window
是对脚本执行的当前浏览器窗口的引用。window.self
显然是其内部的自引用。由于self
这里是全局对象window
的一个属性,因此它也可以作为一个“全局”变量来访问:只需self
。
所以最后三个在大多数情况下确实是一样的。
然而, this
完全不同:它是指向当前范围的变量。如果在控制台中执行以下代码:
> var myPackage = {}
> myPackage.method = function() {console.log(this)}
> myPackage.method()
this
将指向myPackage
对象(method
的范围)。
答案 1 :(得分:2)
this
DOMWindow
this
始终是调用JavaScript表达式的实际上下文。因此,在您的情况下,它是全局上下文,它是在浏览器中运行它时的窗口对象。注意在nodeJs中运行相同的将给你另一个结果。
self
//DOMWindow
返回对窗口对象的对象引用。
window
// DOMWindow
你所谓的:窗口对象。
window.self
//DOMWindow
与调用self相同,因为你的上下文是窗口。因此,当您处于全局范围内时,调用window.self
或仅调用self
或this.self
是相同的。
答案 2 :(得分:1)
此关键字始终是指调用它的上下文。但是,即使在更改上下文后,自身和窗口也会引用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
但是当你在本田的背景下,Car的一个例子:
this = honda
this.self = honda.self
this.self = 5
在使用OOP和继承时,Context在Javascript中扮演着重要的角色。