为什么`这= = window`给我假?

Ruf*_*fus 9 javascript

我一直在测试以下代码,但Firefox16和Chrome22给了我不同的结果.

console.log(this===window); //false in Firefox and true in Chrome
console.log(this.window===window); //true in both Firefox and Chrome
(function(){
    console.log(this===window); //false in Firefox and true in Chrome
    console.log(this.window===window); //true in both Firefox and Chrome
})();
Run Code Online (Sandbox Code Playgroud)

据我所知,Chrome的答案是正确的:除非被调用new,否则this总是与全局对象相同window,这会导致称为范围安全构造函数的模式.

Rob*_*obG 5

假设它window是全局对象,但在ES5之前,没有规范来定义它.这只是惯例(即"DOM 0"的一部分).在ES5§15.1中,有:

在HTML文档对象模型中,全局对象的window属性是全局对象本身

我猜这至少使它成为ECMAScript标准的非规范性部分.

有一段时间,window全球对象之间存在模糊性,但对于大多数用途,它们是同义词.只有某些情况存在差异.

关于声明:

除非使用new调用,否则它始终与全局对象窗口相同

一点也不.函数的this关键字由函数的调用方式设置.在非严格模式下,如果在进入执行上下文时没有thisBinding提供,则将其设置为全局对象.在严格的模式,它是保持原样(即它可能是不确定的,null,0,任何东西).

这导致了一种称为范围安全构造函数的模式

我不确定这意味着什么.函数this与范围无关.当new操作符与函数调用一起使用时,该函数将充当构造函数,并将其this设置为创建的新对象,如同new Object().这似乎是new运营商的一个功能,而不是"范围安全构造函数"的概念.


rai*_*7ow 3

Firefox 的Web 控制台文档本身实际上已经回答了这个问题:

注意:使用 Web 控制台时,this它不是window内容中运行的代码中的对象。这使您可以创建变量而不会污染内容的名称空间。