这在全局范围内的严格模式下(在 ES2015 中)
this in a strict mode in a global scope (in ES2015)
有人可以指出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
。
- Javascript,访问一个主要对象模块模式中的每个对象
- 是否有任何snippet或jQuery插件可以列出easylist.txt模式匹配的DOM中的所有元素
- 试图在引导模式内动态生成图表,得到offsetWidth错误
- 同位素库错误:未捕获错误无布局模式包装生产线8
- 在DOM中查找一个模式并替换它's的内容使用jquery
- 如何缩短MongoDB ObjectId并在Mongoose模式中使用它
- D3.js模式不适用于弧形或圆环图
- Webdriver.io pageObject模式-通过传递参数来定义元素选择器
- 模块模式和这个
- 带有let的JS/EECMAScript6私有字段的模式
- 我是否可以检测到javascript正在被卸载(作为调试模式)
- 执行动态模式弹出
- 注意:wp_enqueue_script调用不正确.在 Wordpress 调试模式下
- AngularJS ui路由器html5模式中断路由
- 包含圆括号的JavaScript Regex模式
- 显示模块模式在Knockout中设置模型的新实例
- Node.js使用Series函数(模式?)实现流控制时出现意外结果
- 这在全局范围内的严格模式下(在 ES2015 中)
- Babel v6-transform-es2015类插件在松散模式下抛出SyntaxError:异步/等待的意外标识符
- 虽然使用babel 6预设es2015包含严格模式,但Node js抛出严格模式错误