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

this in a strict mode in a global scope (in ES2015)

本文关键字:ES2015 模式 全局 范围内      更新时间:2023-09-26

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

我发现它等于我的火狐和铬中的window,但不等于Windows 11 x64下的IE64中的window

我能找到的标准中唯一相关的地方是 ES2015 - ECMAScript 的严格模式,但它看起来很模糊,没有明确说明。

ECMAScript 规范没有定义在特定运行时环境中哪个对象应该是全局对象。对于浏览器,这是由HTML5规范定义的。有一些特殊的大小写用于通过 windowproxy 对象进行window,但这通常对 javascript 是不可见的。

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


您的问题的一个问题是您所谓的全局范围。该规范具有全局词汇环境的概念。但并非所有脚本主体(源代码)都使用领域的全局词法环境作为其词法环境进行评估。

更复杂的是,脚本不仅可以在不同的词汇环境中运行,还可以有多个可以交互但具有离散全局的领域
这似乎不是问题,因为不同的代码领域(例如工作线程或浏览器窗口)主要通过小型 API 表面进行交互,但现实比这更复杂。 例如,一个领域可以使用一个全局对象,该对象具有一个原型,该原型是另一个领域全局的代理。在许多方面,它们看起来像是共享全局,而实际上并非如此,并且执行类似this == this.referenceToSelf可能会返回错误。这通常发生在Firefox的沙箱中,这些沙箱用于运行插件/网络扩展/用户脚本。


"顶级"this不是全局对象的反例是 es6 模块。

  • 查找this是通过向上遍历词汇环境链来迭代完成的,检查其抽象HasThisBinding()属性
  • 模块具有此绑定
  • 该绑定返回undefined
  • 模块在严格模式下运行

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

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