【发布时间】:2026-01-23 04:55:02
【问题描述】:
我想知道这是否是编译器错误,或者这就是它应该的方式。
使用node.js v10.15.3,这段代码报错:
var x
x = false
(function y() { console.log('foo') }())
但是这段代码可以正常工作:
var x
x = false;
(function y() { console.log('foo') }())
区别在于分号。错误消息是:“TypeError: false is not a function”,所以看起来没有分号,编译器将“false”关键字后面的左括号解析为函数调用,就好像我写了“x = false ()”。我花了很长时间才弄清楚我的代码出了什么问题(这显然比上面的例子更复杂。)这是我生命中的一部分,我不会回来!
我的问题是:为什么?我认为分号不需要在行尾?我刚刚阅读了ECMA spec on semicolon insertion 试图弄清楚这一点,但对我来说还是有点模糊。
我想这个故事的寓意就是继续用分号结束所有行。有趣的是,作为一名 C 程序员,这是我的习惯,我只是想通过删除所有不需要的分号来赶上时代。
【问题讨论】:
-
检查自动分号插入(ASI)的规则:*.com/questions/2846283/…
标签: javascript syntax compilation