【问题标题】:Do we need a semicolon after function declaration? [duplicate]函数声明后是否需要分号? [复制]
【发布时间】:2012-08-15 23:24:59
【问题描述】:

可能重复:
JavaScript: When should I use a semicolon after curly braces?

有人在函数声明后添加了分号,但有人没有。这是在函数声明后添加分号的好习惯吗?

function test(o) {
}

function test(o) {
};

【问题讨论】:

标签: javascript


【解决方案1】:

function declaration 不需要(也不应该有)后面的分号:

function test(o) {
}

但是,如果您将函数编写为 expression,就像下面的变量初始化器一样,那么语句应该以分号结束,就像任何其他语句一样:

var a = function test(o) {
};

查看更多关于constructor vs declaration(statement) vs expression的信息。

【讨论】:

  • 为什么函数声明不需要分号?变量声明和变量调用使用分号似乎很奇怪,但只有函数调用而不是函数声明。
【解决方案2】:

实际发生的情况是您在函数后添加了一个空语句。

function test (o) { return o; };

可以被视为类似于:

var test = 0;;

第二个分号本身并不是错误。浏览器将其视为绝对没有发生任何事情的语句。

这里有两件事要记住。

适用于函数声明和控制块(for/if/while/switch/etc)。

函数声明应该定义在你作用域的底部,这样你就不会遇到这样的问题:

function test () {}
(function (window, document, undefined) { /* do stuff */ }(window, document));

因为浏览器会假设你的意思是function test() {}(/*return value of closure*/); 这是一个错误。一个很容易被忽视的非常糟糕和令人讨厌的错误。

但这没关系,因为函数声明可以在 return 语句下,并且仍然可以正常工作。

所以即使你想去:

function doStuff () {
    return (function () { /*process stuff*/ test(); }());
    function test () {}
}

这会很有效。

【讨论】:

    【解决方案3】:

    分号和函数声明:

    function test(o) {
        // body
    } // semicolon no
    
    var test = function (o) {
        // body
    }; // semicolon yes
    

    有关格式化代码问题,请参阅 JSLint

    【讨论】:

    • 第二种函数声明中也不需要分号。运行后的代码没有任何问题。
    【解决方案4】:

    没有。

    定义这样的函数时不需要分号。

    但是,如果你这样定义一个函数:

    var test = function (o) {
    }
    

    这不是绝对必要的,但您可能想要使用它们,特别是如果您将函数放在一行中。

    第一种方式定义了一个函数,而第二种方式将一个函数赋值给一个变量,因此是一个语句。大多数语句用分号分隔。定义函数可以被视为一个常见的反例,因为使用它们的人并不多。

    【讨论】:

      【解决方案5】:

      对于浏览器来说,没关系。就语义而言,仅在您对函数进行原型设计或使用函数语句时才重要。

      function stuff(stuff) {
           alert(stuff);
      } //don't need a semicolon
      
      Object.prototype.stuff = function(stuff) {
          alert(stuff);
      }; //need a semicolon
      var stuff = function(stuff) {
          alert(stuff);
      }; //need a semicolon
      

      【讨论】:

        【解决方案6】:

        定义函数时不需要分号,但加分号也不是错。

        但有一个例外,如果您使用函数包装器并传递参数,您需要在其间添加分号,例如:

        (function(v){alert(v)})('1');
        (function(s){alert(s)})('0')
        

        ... Otherwise forget about them ...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-07-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-11
          • 1970-01-01
          • 2017-12-14
          相关资源
          最近更新 更多