论JS中分号的重要性。

尽管很多项目已经开始采用无分号的写法了,但我认为js作为一门设计有问题的语言,分号还是不能少的。​

JS中的分号与其他语言类似,从C语言继承的语法规则,用于将语句分割开。如果少了分号在某些情况下可能会产生错误,如:

a = 0.1 + 0.2
(a.toFixed(2)) // 0.2 is not a function

上面的实例中括号里的内容在词法分析时被直接忽略掉了。因为存在括号,且上面的语句未被完全终结,所以js认为两行代码是一句函数调用(此时js认为括号里是无法执行的参数)。

分号与自调用函数坑
与上面一样。JS中认为赋值语句,哪怕你写的是个函数,当不加分号时js也会认为这是一句未终结的语句。如:

f = function(x) {
    return x**2
}
(x => f(10))(10); // TypeError: (intermediate value)(...) is not a function

真·一等公民”。不知道大家在写函数赋值语句时会不会加上分号,我个人的话之前没注意过,所以才有今天这个问题。类似的在很多框架你可能会注意到在使用括号的自调用函数中会在括号前添加上分号,用以消除这样的歧义

不过要是你直接声明而并非赋值,那么JS这二货倒是又正常了。

function f(x) {
    return x**2
}
(x => f(10))(10); // => 100

JS中设计不合理的地方
除此以外在return语句中也需要注意分号的问题。

JS中return语句中return所处的行当前返回值为空时是不会分析下面的代码的

要理解这句话我们看个实例就知道了:

function f(x) {
    return
        999;
}
f(9); // => undefined

但如果返回值是一个尾调用,这时JS就开窍了。

g = x => 9
function f(x) {
    return g
        (999);
}
f(9); // => 9