我想知道这是否是一个编译器错误,或者这就是它应该的方式。
使用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 规范试图弄清楚这一点,但对我来说仍然有点模糊。
我想这个故事的寓意就是继续并用分号终止所有行。有趣的是,作为一名 C 程序员,这是我的习惯,我只是想通过放弃所有那些不需要的分号来跟上时代。
JavaScript 解析器看到这个
var x
x = false
(function y() { console.log('foo') }())
as this:
var x;
x = false(function y() { console.log('foo') }());
这意味着您正在尝试致电false
作为一个函数。这是因为 JS 解析器总是尝试获取最长的表达式。
大多数情况下,编写带或不带分号的 JS 只是样式问题。但是,在以下情况下您需要添加分号:
- 有2行代码,并且
- 第一行以可能的标识符(或关键字,例如
if
or while
), and
- 第二行以括号开头。
在这种情况下,分号应添加到第一行的末尾或第二行的开头。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)