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

时间:2012-11-05 01:52:23

标签: 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
})();

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

2 个答案:

答案 0 :(得分:5)

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

  

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

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

有一段时间,window和全局对象之间存在歧义,但对于大多数用途,它们是同义词。只有某些情况存在差异。

关于声明:

  

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

完全没有。函数的this关键字由函数的调用方式设置。在非严格模式下,如果在进入执行上下文时未提供thisBinding,则将其设置为全局对象。在严格模式下,它保持不变(即它可能是未定义的,null0,任何东西。

  

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

我不确定这意味着什么。函数this与范围无关。当new运算符与函数调用一起使用时,该函数将充当构造函数,并且其this设置为创建的新对象,就像new Object()一样。这似乎更像是new运算符的函数,而不是“范围安全构造函数”的概念。

答案 1 :(得分:3)

这实际上是在Firefox的Web Console documentation本身中回答的:

  

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