Javascript 在全球范围内,这是一种严格的模式(在ES2015中)

Javascript 在全球范围内,这是一种严格的模式(在ES2015中),javascript,ecmascript-6,Javascript,Ecmascript 6,请有人指出ES2015标准中的位置,该位置规定了在全球范围内以严格模式使用时,此必须参考的内容 我发现它等于firefox和chrome中的窗口,但不等于Windows7x64下IE11中的窗口 我能找到的标准中唯一相关的地方是,它看起来很模糊,没有明确说明这一点。ECMAScript规范没有定义在特定运行时环境中哪个对象应该是全局对象。对于浏览器,这是由定义的。对于窗口,通过对象有一些特殊的大小写,但javascript通常不可见 即,即使顶级此!==窗口在浏览器脚本中,这不一定源于ecma规

请有人指出ES2015标准中的位置,该位置规定了在全球范围内以严格模式使用时,此必须参考的内容

我发现它等于firefox和chrome中的
窗口
,但不等于Windows7x64下IE11中的
窗口


我能找到的标准中唯一相关的地方是,它看起来很模糊,没有明确说明这一点。

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

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


你的问题的一个问题是你所谓的全球范围。该规范有一个定义。但并非所有脚本体(源代码)都是以领域的全局词法环境作为其词法环境进行计算的

更复杂的是,脚本不仅可以在不同的词汇环境中运行,还可以存在多个领域,这些领域可以相互作用,但具有不同的全局性。
这似乎不是问题,因为不同的代码领域(例如工作人员或浏览器窗口)大多通过较小的API表面进行交互,但实际情况比这更复杂。例如,一个领域可以使用具有原型的全局对象,该原型是不同领域全局对象的代理。在许多方面,它们看起来像是在共享一个全局文件,而实际上它们不是,并且执行类似于
this==this的操作。referenceToSelf
可能返回false。这通常发生在用于运行插件/webextensions/UserScript的firefox上


es6模块是一个反例,其中“顶层”
不是全局对象

  • 以迭代方式完成,检查其抽象
    HasThisBinding()
    属性
  • 模块具有
  • 那个装订
  • 模块
因此存在严格模式代码,其中顶层词法中的
this
不是全局对象


一个更简单的例子是函数上下文中的代码求值。它继承了函数的
this

正如我在对另一个问题的评论中提到的,Windows 10 x64上的IE11(11.0.10240.16384)似乎没有表现出这种行为,因此这里可能还有其他情况。不过,关于规范定义的问题确实很有趣。相关问题:。不确定这是否回答了问题(这相当含蓄),但“全局环境记录始终提供一个this绑定,其值是关联的全局对象。”。在其他情况下(例如函数环境记录),您可以看到逻辑更复杂(即使它没有明确提到严格模式)。问题是它是否应该引用全局对象。这不是关于窗口应该是什么。抱歉,这不是答案。您仍然无法在真空中应用ecma规范。特定脚本的词法环境是什么,因此它的
这个
绑定取决于运行时所做的选择,换句话说,html如何指定应该执行
标记。如果你想正式推导出这个在一个特定范围内的内容,那么你必须考虑这两个规范。“你必须考虑这两个规范”——我不确定这个值是如何成为HTML标准业务的。它知道这件事吗?如果是-哪种标准在严格模式下限制
this
的值?问题在于您询问的是顶级this==global。但您的问题是由浏览器标记中的顶级this==窗口激发的。这两者之间存在差距。首先,您需要建立window==global(html规范)。然后,您就可以了解脚本标记是如何计算的,它们可以做一些疯狂的事情,比如创建新领域或在函数环境中计算(html规范)。只有这样,您才能确定顶级作用域中实际发生的情况,或者严格模式是否有任何区别(es2015规范)。“但您的问题是由浏览器标记中的顶级this==窗口引发的。这两者之间存在差距。”---没有。如果你再读一遍这个问题,你会发现我问的唯一一个问题没有说明有关
窗口的任何内容:“当在全局范围内以严格模式使用时,这必须指什么”。“然后你就知道脚本标记是如何计算的”——问题不是关于浏览器的,这些浏览器的使用只是因为我可以很容易地演示它们在行为上的差异。它可以是nodejs或iojs或任何其他实现。