'use strict'
[1,2,3,4].find(x => x > 1)
使用Node.js 5.0.0执行上述代码时,会出现以下错误:
TypeError: "use strict"[(((1 , 2) , 3) , 4)].find is not a function
at Object.<anonymous> (C:\src\nodejs\ecma6.js:2:11)
at Module._compile (module.js:425:26)
at Object.Module._extensions..js (module.js:432:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:311:12)
at Function.Module.runMain (module.js:457:10)
at startup (node.js:136:18)
at node.js:972:3
如果我在'use strict'之后添加分号,则错误消失。
这看起来像一个错误...或者有更深层次的东西 - 意味着语言规范中是否有一个例外情况列表,其中需要一个分号。
语言规范列出了特殊情况,其中需要使用显式分号。
答案 0 :(得分:7)
这就是为什么总是建议在javascript中使用分号的原因之一。它不起作用的原因是因为代码被解释为:
"use strict"[1,2,3,4] ...
换句话说,它被解释为:
"use strict"[4] ...
因为comma operator。这将计算为字符串"s"
。
现在,其余代码正在尝试:
"s".find()
但是字符串没有find方法。
为了避免这一切,请确保告诉解释器这两行是单独的语句 - 使用分号。
ECMAScript标准(至少ES5)需要此行为。在第7.9.1节第1部分中,定义了管理此案例的规则:
当从左到右解析程序时,遇到任何语法产生不允许的令牌(称为违规令牌),如果一个或多个令牌,则会在违规令牌之前自动插入分号满足以下条件:
违规令牌与前一个令牌至少有一个LineTerminator分开。
- 醇>
违规令牌是}。
在这种情况下,解析"use strict"
和[1,2,3,4]...
。编译器查看结果语句:
"use strict"[1,2,3,4]...
并注意到这是有效的javascript。因此,没有插入分号,因为没有&#34;违规令牌&#34;在声明中找到。