我已经尝试查看ES6草案,但我不确定该去哪里查看:
有人能告诉我ES6中的this
是否必然指向全局对象?此外,这个对象是否具有与全局作用域相同的成员?
如果您也能回答ES5,那就更好了。
我知道在全局作用域中this
指的是浏览器和大多数其他ES环境中的全局对象。我只想知道这是否是规范定义的行为,或者这是实现者添加的扩展行为(并且这种行为是否会在ES6实现中继续)。此外,全局对象总是与全局作用域相同吗?还是有区别的?
更新 - 我为什么要知道: 我基本上想弄清楚如何可靠地在ES5和6中获取全局对象。我不能依赖于
window
,因为它是特定于浏览器的,也不能依赖于global
,因为它是特定于像Node这样的环境的。我知道在Node中this
可以引用模块范围中的module
,但我认为它在全局范围中仍然指向global
。如果可能,我想要一种跨环境的ES5和6兼容方法来获取全局对象。在我所知道的所有环境中,似乎this
在全局作用域下都可以实现,但我想知道它是否是规范的一部分(并且因此可靠地跨任何可能不熟悉的环境)。
我还需要知道全局作用域和全局对象是否根据规范是同一个东西。换句话说,所有全局作用域中的变量是否与globalobject.variable_name
相同?
更新2 - 我想做什么:
我开发了一些 ES6 shims for ES5 environments。我想知道最好的方法是(1)检查ES6内置对象是否已经存在,以便在可能时使用它们而不是我的shim,并且(2)如果内置对象不存在,则将我的shim添加到全局范围。
目前我正在遵循这个模式:
(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)向该对象添加属性是否允许我将变量添加到全局范围内?
this
并不是 ES6 特有的语法,应该像之前的 ES 标准一样工作。this
的含义取决于它的使用位置,并不总是全局对象。 - Jaythis
与window
相同,后者也是全局对象。但我不知道这是否在ES中有规定,或者它只是语言的浏览器扩展。 - Nathan Wall