关于js分号的问题?

关于js分号的讨论

请问各位大牛,javascript应该在语句末尾加分号吗?

阅读 6.2k
3 个回答

分号加与不加完全取决于个人习惯,但为了代码稳定(解析出错)还是建议使用分号断句。

JavaScript自动加分号规则:
1.当有换行符(包括含有换行符的多行注释),并且下一个token没法跟前面的语法匹配时,会自动补分号。
2.当有}时,如果缺少分号,会补分号。
3.当程序源代码结束时,如果缺少分号,会补分号。
结论:
1.在return、break、continue、后自增、后自减五种语句中,换行符可以完全替代分号的作用。
2.var if do while for continue break return with switch throw try debugger几种关键字开头的语句,以及空语句,上一行加不加分号影响不大。
3.凡表达式语句和函数表达式语句,后面不加分号非常危险,情况极其复杂。
4.凡(和[开头的语句,前面不加分号极度危险。

大部分情况你不加分号也不会导致错误,但是代码的可读性就会变差,比如你一行表达式写得特别长,想分成两行,前面那行末尾没有分号,第一眼看上去让人很难分辨是不是一行已经结束了。

再举个会导致错误的例子

var a = function (param) {
    console.log(param)
    return function(){console.log("return function")}
};   // 这里不加分号就会导致非预期的执行结果

(function() {
    console.log("anonymous function!")
})()

注释的地方如果加了分号, 那么上面是一个函数声明,下面是一个匿名立即执行函数,执行结果是打印"anonymous function!"

如果不加分号,实际执行的时候将会变成

var a = function (param) {
    console.log(param)
    return function(){console.log("return function")}
}(function() {
    console.log("anonymous function!")
})()

第二个匿名函数就变成了第一个匿名函数的参数,被完整地打印出来,然后返回的函数也被末尾的"()"调用执行,打印出"return function"


所以为了避免各种不必要的麻烦,最好还是都写上分号,但也不是所有行末都要加分号的

JS里面有个东西叫做Semicolon Insertion,你可以理解为解释器会按照一定规则自动帮你在适当的位置补充分号,这个规则会告诉你哪些地方该有,哪些地方不该有分号

尽管如此,按照这个规则书写的代码才可以被称之为是『优雅的』 ^.^

新手上路,请多包涵

为了合并,压缩文件不出问题,最好还是加上

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏