我一直在测试以下代码,但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,这会导致称为范围安全构造函数的模式.
假设它window是全局对象,但在ES5之前,没有规范来定义它.这只是惯例(即"DOM 0"的一部分).在ES5§15.1中,有:
在HTML文档对象模型中,全局对象的window属性是全局对象本身
我猜这至少使它成为ECMAScript标准的非规范性部分.
有一段时间,window全球对象之间存在模糊性,但对于大多数用途,它们是同义词.只有某些情况存在差异.
关于声明:
除非使用new调用,否则它始终与全局对象窗口相同
一点也不.函数的this关键字由函数的调用方式设置.在非严格模式下,如果在进入执行上下文时没有thisBinding提供,则将其设置为全局对象.在严格的模式,它是保持原样(即它可能是不确定的,null,0,任何东西).
这导致了一种称为范围安全构造函数的模式
我不确定这意味着什么.函数this与范围无关.当new操作符与函数调用一起使用时,该函数将充当构造函数,并将其this设置为创建的新对象,如同new Object().这似乎是new运营商的一个功能,而不是"范围安全构造函数"的概念.
| 归档时间: |
|
| 查看次数: |
182 次 |
| 最近记录: |