我一直在测试以下代码,但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
相同,这会导致称为范围安全的模式构造
答案 0 :(得分:5)
假设window
是全局对象,但在ES5之前,没有规范来定义它。这只是惯例(即“DOM 0”的一部分)。在ES5 §15.1中,有:
在HTML文档对象模型中,全局对象的window属性是全局对象本身
我猜这至少使它成为ECMAScript标准的非规范性部分。
有一段时间,window
和全局对象之间存在歧义,但对于大多数用途,它们是同义词。只有某些情况存在差异。
关于声明:
除非使用new调用,否则它始终与全局对象窗口相同
完全没有。函数的this
关键字由函数的调用方式设置。在非严格模式下,如果在进入执行上下文时未提供thisBinding
,则将其设置为全局对象。在严格模式下,它保持不变(即它可能是未定义的,null
,0
,任何东西。
导致一种称为范围安全构造函数的模式
我不确定这意味着什么。函数this
与范围无关。当new
运算符与函数调用一起使用时,该函数将充当构造函数,并且其this
设置为创建的新对象,就像new Object()
一样。这似乎更像是new
运算符的函数,而不是“范围安全构造函数”的概念。
答案 1 :(得分:3)
这实际上是在Firefox的Web Console documentation本身中回答的:
注意:使用Web控制台时,
this
不是window
对象 将在内容中运行的代码。这允许您创建变量 不会污染内容的名称空间。