JavaScript和分号

时间:2015-11-11 04:28:25

标签: node.js typeerror strict

'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'之后添加分号,则错误消失。

这看起来像一个错误...或者有更深层次的东西 - 意味着语言规范中是否有一个例外情况列表,其中需要一个分号。

语言规范列出了特殊情况,其中需要使用显式分号。

1 个答案:

答案 0 :(得分:7)

这就是为什么总是建议在javascript中使用分号的原因之一。它不起作用的原因是因为代码被解释为:

"use strict"[1,2,3,4] ...

换句话说,它被解释为:

"use strict"[4] ...

因为comma operator。这将计算为字符串"s"

现在,其余代码正在尝试:

"s".find()

但是字符串没有find方法。

为了避免这一切,请确保告诉解释器这两行是单独的语句 - 使用分号。

附加说明:

ECMAScript标准(至少ES5)需要此行为。在第7.9.1节第1部分中,定义了管理此案例的规则:

  

当从左到右解析程序时,遇到任何语法产生不允许的令牌(称为违规令牌),如果一个或多个令牌,则会在违规令牌之前自动插入分号满足以下条件:

     
      
  1. 违规令牌与前一个令牌至少有一个LineTerminator分开。

  2.   
  3. 违规令牌是}。

  4.   

在这种情况下,解析"use strict"[1,2,3,4]...。编译器查看结果语句:

"use strict"[1,2,3,4]...

并注意到这是有效的javascript。因此,没有插入分号,因为没有&#34;违规令牌&#34;在声明中找到。