9

我一直在测试以下代码,但 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,这导致了一种称为范围安全构造函数的模式。

4

2 回答 2

5

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

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

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

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

关于声明:

除非用 new 调用,否则它总是与全局对象窗口相同

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

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

我不确定那是什么意思。函数this与作用域无关。当new运算符与函数调用一起使用时,该函数充当构造函数,并将其this设置为一个新对象,就像由new Object(). 这似乎更像是new运算符的功能,而不是“范围安全构造函数”的概念。

于 2012-11-05T02:00:04.583 回答
3

这实际上在 Firefox 的Web 控制台文档本身中得到了回答:

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

于 2012-11-05T02:13:23.840 回答