Nat*_*all 5 javascript ecmascript-5 ecmascript-harmony
我已经尝试过自己查看ES6草案,但我不确定在哪里看:
有人能告诉我,this在ES6中是否必然引用全局对象?此外,此对象是否与全局范围具有相同的成员?
如果您能回答ES5也会有所帮助.
我知道this在全局范围内是指浏览器和大多数其他ES环境中的全局对象,如Node.我只是想知道这是规范定义的行为,还是实现者已添加的扩展行为(如果这种行为在ES6实现中继续).另外,全局对象总是与全局范围相同吗?或者有区别吗?
更新 - 为什么我想知道:我基本上是想弄清楚如何在ES5和6中可靠地获取全局对象.我不能依赖,window因为这是特定于浏览器的,我也不能依赖,global因为这是特定于环境的喜欢Node.我知道this在Node中可以参考module模块范围,但我认为它仍然指的是global全局范围.我想要一个跨环境ES5和6兼容的方式来获取全局对象(如果可能).似乎this在全球范围内我所知道的所有环境都是这样,但我想知道它是否是实际规范的一部分(在我可能不熟悉的任何环境中都是如此可靠).
我还需要知道全局范围和全局对象是否与规范相同.换句话说,全局范围内的所有变量都是一样的globalobject.variable_name吗?
更新2 - 我正在尝试做的事情:
我为ES5环境开发了一些ES6垫片.我想知道(1)检查ES6内置函数是否已经存在以便在可能的情况下使用它们而不是我的垫片,以及(2)将垫片添加到全局范围内的最佳方法(1) 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
})();
})();
Run Code Online (Sandbox Code Playgroud)
(1)还有其他一些可能性,但是在一天结束时我需要一种方法来向全局范围添加一些内容而不使用var全局范围(因为在我检查它们之前它会覆盖内置函数,因为var起重[至少在天真的情况下,也许我可以间接eval一个var说法呢?]).我希望我的代码能够以严格模式运行,这样才能解决问题.
我发现,根据ES5规范,间接eval执行全局范围内的代码.所以我至少能够做到这一点.我的问题是,如果我进入this全球范围,(1)检查该对象的属性是否让我知道全局范围内是否已存在内置?(2)向该对象添加属性是否允许我将变量添加到全局范围?
是的,this在ES6中全局作用域将继续引用全局对象。(一般来说,ES6 应该是完全向后兼容的,即任何保证在 ES5 中工作的代码也应该在 ES6 中工作)。
然而,“全局作用域”的概念将不再与 ES6 中的全局对象相同。它引入了词法作用域的新声明形式(let、const、class、module等)。上次会议的结论是,这些都不会作为全局对象的属性出现。这有多种技术和方法上的原因,但最重要的是,最好完全避免直接使用全局对象(这一直是正确的,但在 ES6 中更是如此)。
您是否需要全局对象来实现某些特定目的?
| 归档时间: |
|
| 查看次数: |
1775 次 |
| 最近记录: |