【问题标题】:Is a semicolon required before a function closure in javascript?javascript中的函数闭包之前是否需要分号?
【发布时间】: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 程序员,这是我的习惯,我只是想通过删除所有不需要的分号来赶上时代。

【问题讨论】:

标签: javascript syntax compilation


【解决方案1】:

JavaScript 解析器看这个

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

这样:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    关于 false 被作为函数调用是正确的。 您的第一个代码块相当于:

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

    由于没有分号分隔行,js 解释器调用关键字 false,将函数 y 作为参数传入。这显然会导致错误,因为 false 是不可调用的。

    在这种情况下几乎需要使用分号,其中左括号是一行中的毛皮字符。仅在必要时使用分号的一种方法是将它们放在左括号之前,如下所示:

    var x
    x = false
    ;(function y(){...})
    

    【讨论】:

      【解决方案3】:

      在某些情况下,换行无关紧要。在没有换行符的情况下代码是正确的语法。

      考虑下面的 sn-p,其中一个嵌套函数用两个 () 调用,并且调用由一行分隔。不过没关系。

      function x(){
        return function(){ return 6}
      }
      let a =
      x()
      
      ()
      console.log(a) //6

      以上行仍将被评估为

      let a = x()()
      

      一般规则是,只要代码有意义并且没有分号就不会抛出错误。它不会在那里插入半彩色。只有在别无选择时才插入分号。

      【讨论】:

        最近更新 更多