这是全局范围内的严格模式(在 ES2015 中)

2024-01-03

有人可以指出 ES2015 标准中说明什么的地方吗?this在全局范围内以严格模式使用时必须引用?

我发现它等于window在我的 firefox 和 chrome 中,但不等于window在我的 Windows 7 x64 下的 IE11 中。

我能找到的标准中唯一相关的地方是ES2015 - ECMAScript 的严格模式 http://www.ecma-international.org/ecma-262/6.0/#sec-strict-mode-of-ecmascript但它看起来很模糊并且没有明确说明。


ECMAScript 规范没有定义在特定的运行时环境中哪个对象应该是全局的。对于浏览器来说,这是由HTML5 规范 https://html.spec.whatwg.org/#global-object。有一些特殊的外壳window通过窗口代理 https://html.spec.whatwg.org/#windowproxy对象,但通常对于 javascript 来说应该是不可见的。

IE。即使顶级this !== window在浏览器脚本中,这不一定源于 ecma 规范属性或严格模式。它也可能源于 html 规范的定义,对于特定的脚本环境,全局应该是什么,或者该全局是否实际上等于<local variable bindings>.window.


你的问题的一个问题是你所说的全球范围。该规范有一个概念全局词汇环境 http://www.ecma-international.org/ecma-262/6.0/#sec-lexical-environments。但并非所有脚本体(源代码)都使用领域的全局词法环境作为其词法环境进行评估。

更复杂的是,脚本不仅可以在不同的词法环境中运行,而且还可以有多个realms它可以交互但又具有不同的全局变量。
这似乎不是问题,因为不同的代码领域(例如工作人员或浏览器窗口)主要通过小型 API 界面进行交互,但现实比这更复杂。例如。一个领域可以使用一个全局对象,该对象具有一个原型,该原型是另一个领域的全局对象的代理。在很多方面,它们看起来像是共享一个全局,但实际上并非如此,并且做类似的事情this == this.referenceToSelf可能会返回 false。这通常发生在 Firefox 中沙箱 https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Language_Bindings/Components.utils.Sandbox用于运行插件/网络扩展/用户脚本。


一个反例,其中“顶级”this不是全局对象将是 es6 模块。

  • 抬头看this http://www.ecma-international.org/ecma-262/6.0/#sec-resolvethisbinding是迭代完成的通过向上遍历词汇环境链 http://www.ecma-international.org/ecma-262/6.0/#sec-getthisenvironment,检查其摘要HasThisBinding()财产
  • 模块有一个这个绑定 http://www.ecma-international.org/ecma-262/6.0/#sec-module-environment-records-hasthisbinding
  • 那个绑定returns undefined http://www.ecma-international.org/ecma-262/6.0/#sec-module-environment-records-getthisbinding
  • modules 以严格模式运行 http://strict%20mode%20code

所以存在严格模式代码,其中this在顶级词法中不是全局对象。

一个更简单的例子是在函数上下文中评估代码。它继承了this从函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这是全局范围内的严格模式(在 ES2015 中) 的相关文章