首页 > 解决方案 > javascript中的函数闭包之前是否需要分号?

问题描述

我想知道这是否是编译器错误,或者这就是它应该的方式。

使用 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 程序员,这是我的习惯,而我只是想通过删除所有不需要的分号来赶上时代。

标签: javascriptsyntaxcompilation

解决方案


JavaScript 解析器看到这个

var x
x = false
(function y() { console.log('foo') }())

像这样:

var x;
x = false(function y() { console.log('foo') }());

这意味着您正在尝试false作为函数调用。这是因为 JS 解析器总是试图获取最长的表达式。

在大多数情况下,编写带或不带分号的 JS 只是样式问题。但是,您需要在以下情况下添加分号:

  • 有2行代码,和
  • 第一行以可能的标识符(或关键字,like ifor while)结尾,并且
  • 第二行以括号开头。

在这种情况下,分号应添加到第一行的末尾或第二行的开头。


推荐阅读