【问题标题】:When to use a semicolon [duplicate]何时使用分号[重复]
【发布时间】:2013-06-24 01:13:22
【问题描述】:

特别是在 JavaScript 中,什么时候使用分号,什么时候不使用。

这是一个sn-p的示例代码;

function Drawable() {
   this.init = function(x, y) {
      this.x = x;
      this.y = y;
   }

   this.speed = 0;
   this.canvasWidth = 0;
   this.canvasHeight = 0;

   this.draw = function() {
   };
}

谁能告诉我为什么

this.init = function(x,y) {}

但不以分号结尾

this.draw = function(){};

上面的sn-p代码是否以分号结尾?

【问题讨论】:

  • 其实我想说的答案是你很细心;我在编码时的挑剔也会在第一个分号中添加分号。也就是说,我可以理解为什么有人不会想到包含它(我所知道的所有 JS 解析器都会很容易地自动处理)
  • 这是因为编写该代码的人不一致。
  • 如果this.init} 后面的任何空格后面的下一个字符以( 开头,this.init 将是调用匿名函数的结果。

标签: javascript


【解决方案1】:

这是个人风格问题,因为 JavaScript 运动 automatic semicolon insertion.:

当从左到右解析程序时,遇到任何语法产生式都不允许的标记(称为违规标记)时,然后自动插入分号违规标记如果... 违规标记与前一个标记至少有一个 LineTerminator 分隔。

第一个不以分号结尾是因为上面的代码不一致。

一致的方式是:

this.init = function(x, y) {
   this.x = x;
   this.y = y;
};

you should use them的问题之前在SO里讨论过。

【讨论】:

    【解决方案2】:

    来自Google JavaScript Style Guide

    // 1.
    MyClass.prototype.myMethod = function() {
      return 42;
    }  // No semicolon here.
    
    (function() {
      // Some initialization code wrapped in a function to create a scope for locals.
    })();
    
    
    var x = {
      'i': 1,
      'j': 2
    }  // No semicolon here.
    
    // 2.  Trying to do one thing on Internet Explorer and another on Firefox.
    // I know you'd never write code like this, but throw me a bone.
    [normalVersion, ffVersion][isIE]();
    
    
    var THINGS_TO_EAT = [apples, oysters, sprayOnCheese]  // No semicolon here.
    
    // 3. conditional execution a la bash
    -1 == resultOfOperation() || die();
    

    1 - JavaScript 错误 - 首先调用返回 42 的函数 第二个函数作为参数,那么数字 42 被“调用” 导致错误。

    2 - 你很可能会得到一个“不这样” 运行时未定义的属性错误,因为它试图调用 x[ffVersion]isIE。

    3 - die 被调用,除非 resultOfOperation() 是 NaN 和 THINGS_TO_EAT 被赋值为 die() 的结果。

    【讨论】:

    • 这在谷歌代码风格指南中的“有几个地方缺少分号特别危险:”但你的回答听起来像是预期的风格。
    • @BenjaminGruenbaum 我认为他的第一个示例并不少见(在构造函数中定义方法并在最后使用 IIFE 作为初始化方法)。我也偶然发现了这一点,我花了很长时间才找出我的错误在哪里。在某种程度上,我想这仍然是一个风格问题,但我也认为应该鼓励人们不要过于依赖 ASI,而应该学习在哪里放置分号。
    • @basilikum 哦,我完全同意,我总是使用分号,而且我总是使用 JSHint 对我的代码进行 lint。这不是我要评论的。我个人不喜欢 ASI。
    • @BenjaminGruenbaum 那么我可能误读了您的评论。很抱歉。
    猜你喜欢
    • 2019-05-14
    • 1970-01-01
    • 2011-03-20
    • 2016-04-29
    • 1970-01-01
    • 2014-09-09
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多