分号

一般不需要加分号。特殊场景下换行不加分号会出问题。 《google javascript代码风格指南》是这样建议的: 每一语句的结尾都要加上分号噢。 如果不加分号JS解释器也会按隐式分隔的标准去执行,但那样调试、压缩、合并的时候都很不方便。不要那样做嘛你可以做的更好的不是么。 而且在某些情况下,不写分号可是很危险的。 原因: JS语句以分号作为结束符使得JS解释器解析,如果省略分号,就会由JS解释器确定语句的结尾。尼玛,不是在很明确的情况下,它能确定么?上面几个例子里,都是在语句中声明了/函数/对象/数组,但闭括号("}"或"]")并不代表着结束。如果下一个语句开始是一个中缀或括号运算符,那JS就永远不会结束声明。 注:加上分号可以增进代码的性能,这样解析器就不必再计算插入分号的位置。 解释: 现代js绝大多数时候确实不是必须要写分号,只有特殊场景不写分号才会出问题。 如果不适用分号,编译代码时就会依靠语句间隐式的分割,可能会造成细微的调试的问题,千万不要这样做,很多时候不写分号是很危险的:

// 1.
MyClass.prototype.myMethod = function() {
    return 42;
}  // 这里没有分号.

(function() {
    // 一些局部作用域中的初始化代码
})();

var x = {
    'i': 1,
    'j': 2
}  //没有分号.

// 2.  试着在IE和firefox下做一样的事情.
//没人会这样写代码,别管他.
[normalVersion, ffVersion][isIE]();

var THINGS_TO_EAT = [apples, oysters, sprayOnCheese]  //这里没有分号

// 3. 条件语句
-1 == resultOfOperation() || die();

编译器运行此代码时会遇到编译问题,为什么呢?

1、js错误。返回42的函数运行了,因为后面有一对括号,而且传入的参数是一个方法,然后返回的42被调用,导致出错了。

2、你可能会得到一个“no sush property in undefined”的错误,因为在执行的时候,解释器将会尝试执行 x[normalVersion, ffVersion][isIE]() 这个方法。

3、die 这个方法只有在 resultOfOperation() 是 NaN 的时候执行,并且 THINGS_TO_EAT 将会被赋值为 die() 的结果。

这到底时怎么回事呢?

这是因为js语句要求以分号结尾,除非能够正确地推断分号的位置。在这个例子当中,函数声明、对象和数组字面量被写在了一个语句当中。右括号(”)”、”}”、”]”)不足以证明这条语句已经结束了,如果下一个字符是运算符或者”(”、”{”、”[”,js将不会结束语句,所以一定要确保用分号结束语句。

最后我们再说一下函数与分号

函数表达式后面要分号结束,但是函数声明就不需要。例如:

var foo = function() {
    return true;
};  // 这里要分号

function foo() {
    return true;
}  // 这里不用分号