javascript - ECMAScript 6 全局范围内的 `this`

标签 javascript ecmascript-5 ecmascript-harmony

我自己试过查看 ES6 草案,但我不确定去哪里查看:

谁能告诉我 ES6 中的 this 是否一定指的是全局对象?此外,此对象是否具有与全局范围相同的成员?

如果您能回答 ES5,那也会有帮助。

我知道 this 在全局范围内是指浏览器和大多数其他 ES 环境(如 Node.js)中的全局对象。我只想知道这是规范定义的行为还是实现者添加的扩展行为(以及这种行为是否会在 ES6 实现中继续)。另外,全局对象总是和全局作用域一样吗?还是有区别?


更新 - 为什么我想知道:我基本上是想弄清楚如何在 ES5 和 6 中可靠地获取全局对象。我不能依赖 window 因为它特定于浏览器,我也不能依赖 global 因为它特定于像 Node 这样的环境。我知道 Node 中的 this 可以引用模块范围内的 module ,但我认为它仍然引用全局范围内的 global 。我想要一种跨环境的 ES5 & 6 兼容方式来获取全局对象(如果可能)。似乎在我所知道的所有环境中,全局范围内的 this 都是这样做的,但我想知道它是否是实际规范的一部分(并且在我可能不熟悉的任何环境中都如此可靠).

我还需要知道全局作用域和全局对象是否符合规范。换句话说,全局范围内的所有变量是否都与 globalobject.variable_name 相同?


更新 2 - 我正在尝试做什么:

我开发了一些ES6 shims for ES5 environments .我想知道最好的方法 (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(因为那会覆盖内置的-ins 在我检查它们之前,由于 var 提升 [至少在天真的情况下,也许我可以间接 eval 一个 var 声明还有?])。我希望我的代码能够在严格模式下运行,这样问题就复杂了。

我发现,根据 ES5 规范,间接 eval 在全局范围内执行代码。所以我至少能够做到这一点。我的问题是,如果我在全局范围内得到 this,(1) 检查该对象的属性是否会让我知道全局范围内是否已经存在内置对象? (2) 向该对象添加属性是否允许我向全局范围添加变量?

最佳答案

是的,全局范围内的this会继续引用ES6中的全局对象。 (通常,ES6 应该是完全向后兼容的,即任何保证在 ES5 中工作的代码也应该在 ES6 中工作)。

然而,“全局作用域”的概念将不再等同于 ES6 中的全局对象。它引入了词法作用域的新声明形式(letconstclassmodule 等) ).上次 session 的结论是,这些都不会作为全局对象的属性出现。这有多种技术和方法上的原因,但底线是最好完全避免直接使用全局对象(这一直是正确的,但在 ES6 中更是如此)。

有什么特定的东西需要全局对象吗?

关于javascript - ECMAScript 6 全局范围内的 `this`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13425333/

相关文章:

javascript - 如何识别 Promise.all() 中的结果

javascript - Angular 在所需组件内创建动态组件

javascript - 是否可以在 ecmascript-harmony 中找到对象的类和模块

javascript - 遍历范围的函数式方法 (ES6/7)

javascript - 检索动态 ng-model 值时出错

javascript - 为什么在 Javascript 严格模式下不允许删除?

javascript - 如何使用 Traceur 在 ES6 类中实现私有(private)方法

JavaScript 在迭代数组时等待后端响应

javascript - 我们可以用 ES6 Generator 做哪些不能用 for 循环做的事情?

javascript - 如何使当前 div 部分的名称显示在另一个 div 中?