来看看 JavaScript 变态的兼容性:为了兼容 20 年前的网页,你知道我有多努力吗

如果你经常关注我的文章,那么你应该对不久前 JavaScript 社区由一个库引发的“smoosh 门”事件还有印象。而最新的 ES 规范将使用 作为函数名来代替 。TC39 会议给出的理由是“不能 break the web”。

而之前的一次民间投票结果显示,69% 的人希望 break the web:

那我现在问题来了,如果我们使用了某个单词做变量,但是突然有一天,这个单词变成了 JavaScript 的关键字,会发生什么呢?

JavaScript 中称这些为保留字(Reserved Words),指 JavaScript 预留的一些标识符名(IdentifierName),保留字不能用作变量、函数名、和对象名。

保留字包括:关键字、未来保留字、Null 字面量,布尔字面量。ES6 规范定义了 33 个关键字,2 个未来保留字,以及 6 个严格模式下的未来保留字。未来保留字通常是那些其它语言广泛使用的关键字,ES 提前预留出来以备将来使用。

由于 JavaScript 的 runtime 的特殊性,所以必须要保证变态的兼容性。由于 es6 的变动比较大,就以 es6 举例吧。

我们在 es5 规范中可以看到一些保留字:

ES6 规范中把一些变成了关键字,而且又新增加了未来保留字 await。因此 es6 的未来保留字有 2 个:

那么,如果某些单词变成了关键字了怎么办?

如果 10 年前写的 JavaScript 用到了某个单词,而这个单词在最新 es 规范变成了关键字,那么直接抛语法错误吗?

比如最常见的 关键字。而 es 规范以及考虑到了这种情况:

In some contexts is given the semantics of anIdentifier. See 12.1.1. Instrict mode code, and are treated as reserved keywords through static semantic restrictions (see 12.1.1,13.3.1.1,13.7.5.1, and 14.5.1) rather than the lexical grammar.

在某些上下文中, 可以作为标识符。在严格模式代码中, 和 通过静态语义(static semantic)限制,而不是词法语法分析(lexical grammar)作为保留关键字处理。

ES7(ES2016) 规范没有新增关键字和未来保留字。

ES8(ES2017) 规范把 从未来保留字(FutureReservedWords)变成了关键字。语义和 一样。

以下代码都是正确的:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180612B1RGOO00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券