我自己尝试过查看 ES6 草案,但我不确定在哪里查看:
有人可以告诉我this
在 ES6 中是否一定指的是全局对象?此外,该对象是否具有与全局范围相同的成员?
如果你能回答 ES5,那也会很有帮助。
我知道this
在全局范围内是指浏览器和大多数其他 ES 环境中的全局对象,例如 Node.js。我只想知道这是规范定义的行为,还是实现者添加的扩展行为(以及这种行为是否会在 ES6 实现中继续存在)。此外,全局对象是否总是与全局范围相同?还是有区别?
更新 - 为什么我想知道:我基本上是想弄清楚如何在 ES5 和 6 中可靠地获取全局对象。我不能依赖,window
因为那是特定于浏览器的,我也不能依赖,global
因为那是特定于环境的像节点。我知道this
Node 可以module
在模块范围内引用,但我认为它仍然是global
在全局范围内引用。我想要一种跨环境的 ES5 & 6 兼容方式来获取全局对象(如果可能的话)。似乎在我所知道的this
全局范围内的所有环境中都这样做,但我想知道它是否是实际规范的一部分(并且在我可能不熟悉的任何环境中都如此可靠)。
我还需要知道规范中的全局范围和全局对象是否相同。换句话说,全局范围内的所有变量都与globalobject.variable_name
?
更新 2 - 我正在尝试做的事情:
我为 ES5 环境开发了一些 ES6 垫片。我想知道 (1) 检查 ES6 内置插件是否已经存在,以便在可能的情况下可以使用它们而不是我的垫片,以及 (2) 如果内置 - ins 尚不存在。
目前我正在遵循这种模式:
(function() {
// Indirect eval to run in global scope.
// (We get whatever "this" is in global scope, hoping that it's the global object...
// Whether this line does what I want it to is the crux of my question.)
var global = (0, eval)('this');
// If Symbol does not already exist in global scope,
if (!global.Symbol)
// Then add Symbol to global scope.
global.Symbol = (function() {
// ...
// Return my Symbol shim
})();
})();
(1) 还有其他一些可能性,但归根结底,我需要一种方法来在全局范围内添加一些东西而不var
在全局范围内使用(因为在我检查它们之前会覆盖内置函数,因为var
提升 [至少在幼稚的情况下,也许我也可以间接eval
声明var
?])。我希望我的代码能够在严格模式下运行,从而使问题更加复杂。
我发现,根据 ES5 规范,间接eval
执行全局范围内的代码。所以我至少能够做到这一点。我的问题是,如果我进入this
全局范围,(1)检查该对象的属性是否会让我知道全局范围中是否已经存在内置?(2) 向该对象添加属性是否允许我将变量添加到全局范围?