- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我自己试过查看 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 中的全局对象。它引入了词法作用域的新声明形式(let
、const
、class
、module
等) ).上次 session 的结论是,这些都不会作为全局对象的属性出现。这有多种技术和方法上的原因,但底线是最好完全避免直接使用全局对象(这一直是正确的,但在 ES6 中更是如此)。
有什么特定的东西需要全局对象吗?
关于javascript - ECMAScript 6 全局范围内的 `this`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13425333/
我正在尝试为我的组件中声明的数组分配一个值。不幸的是,抛出了异常。 TypeError: Attempted to assign to readonly property 即使我删除了严格模式,仍然会
如果我将一个类导入到其他脚本中,我如何将参数传递给 ES6 语法中的类构造函数? 我想做这样的事情。我已经看到了各种建议,例如包装函数或使用工厂模式,但是否有更简洁、更简单的方法来做到这一点? //
我最近看了 ECMAScript 2015。 ECMAScript 2015 有类初始化器吗? 例如,我试着把类写得像一个解析器; class URLParser { parse(url) {
我目前正在尝试弄清楚为什么 JSDT 会发布类似“JavaScript error on valid regex”的错误'. 在我进行测试时,我意识到它适用于像这样的简单文件: var a = {
有一段时间我认为它们是同一回事,但我经常看到博客或此处的答案中的措辞似乎暗示两者之间存在差异。即使 SO 有两个不同的标签,但它们的描述并没有显示出任何明显的区别。 我四处搜索了一下,这只会增加困惑,
我最近使用了最新的 Laravel 5.3。在 gulp.js文件,有较新的 ES6 箭头函数语法: elixir(mix => { mix.sass('app.scss') .
在 block 作用域函数方面,ES6 相对于 ES5 有哪些优势?我的意思是,在这两种情况下,该 block 看起来非常相似,那么它有什么区别,性能方面哪种方法更好? ES6 block {
所以,我知道在 GWT 中我可以编写纯 javascript 代码的 JSNI 代码。但是,不幸的是,如果我在其中使用 ES6 代码,JSNI 代码将无法编译。 这意味着,例如,我不能做这样的事情:
所以,我知道在 GWT 中我可以编写纯 javascript 代码的 JSNI 代码。但是,不幸的是,如果我在其中使用 ES6 代码,JSNI 代码将无法编译。 这意味着,例如,我不能做这样的事情:
如何在 Visual Studio Code 中编写 ECMAScript 代码??我尝试编写 jsconfig.json 但不确定如何运行该文件。我什至尝试更改 tasks.json 但即使那样也无
尽管事实是const不能在 ECMAScript 2015 中赋值,如果对象没有被卡住,可以修改 Object.freeze . 自 const应该是不可变的,添加 Object.freeze 有意义
当我打开我的项目 .js 文件时,会出现以下警告: File watcher 'Babel' is available for this file. Description: 'Transpiles
我接受了 JavaScript 前端开发人员职位的面试。我失败了,因为我不知道一些高级问题。请帮助我至少理解这一点。 我的问题在于 ECMAScript 6 知识,而不是 ECMAScript 5 中
本文介绍ECMAScript 6即将带给我们新的数组操作方法,以及在怎样在现有浏览器应用这些新的数组特性。 Note: 我将使用交替使用构造器(constructor)和类(class)两个术语。
我指的是 https://tc39.es/ecma262/#sec-regexp-regular-expression-objects 中定义的 ECMAScript 正则表达式语法. 我通过几个在线
我有多个名为 PageX 的文件, PageY , PageZ等等 每一个都有一个 export default SETUP { path:'blah_X', component:X } . 在我的
也许这是一个基本问题,但是两者之间有什么区别: -在ES3支持下开发的一个Web项目, -在ES5支持下开发的Web项目? 换句话说,如果您支持ES5,则可以在项目中添加哪些增强功能? 最佳答案 在这
这个问题在这里已经有了答案: One-liner to take some properties from object in ES 6 (12 个答案) 关闭 6 年前。 是否有一个我正在空白的单
一段时间以来,我一直在使用 ES6 提供的模块。虽然我(本能地)知道最好使用它们,但我很难解释为什么。 带模块; 我可以做依赖声明(不是注入(inject))。我不必为我加载的每个 javascrip
从不可变映射中获取多个值的最佳方法是什么? const example = new Map({ id: 1, first: 'John', last: 'Smith',
我是一名优秀的程序员,十分优秀!