这个,自我,窗口和窗口之间有什么区别。自己

时间:2012-02-09 20:31:24

标签: javascript

如果我打开一个空页面并在javascript控制台中运行以下命令,我会得到相同的结果:

  >>> this
  DOMWindow

  >>> self
  DOMWindow

  >>> window
  DOMWindow

  >>> window.self
  DOMWindow

他们指的是什么? ......同一个对象还是其他什么?

3 个答案:

答案 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

From the MDN Docs

  

返回对窗口对象的对象引用。

window
// DOMWindow

你所谓的:窗口对象。

window.self
//DOMWindow

与调用self相同,因为你的上下文是窗口。因此,当您处于全局范围内时,调用window.self或仅调用selfthis.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中扮演着重要的角色。