关于javascript:JavaScript-代码加不加分号有什么区别

2次阅读

共计 2223 个字符,预计需要花费 6 分钟才能阅读完成。

这个问题在很多文章中都探讨过,在 ESlint 标准中也因为加不加分号而分为两大阵营,到于加不加分号,要害是须要理解分号对于 JavaScript 的影响,开始之前能够先看看上面这道面试题:

请问这段代码是否可能失常运行?

var a = 1
(function() {console.log(2)
})()

如果运行这段代码,会呈现上面的谬误:

Uncaught TypeError: 1 is not a function

什么鬼!1 is not a function?咱们没有打算运行数字 1,为什么说数字 1 不是函数,这种谬误是很难找到起因的,常常会在出问题的代码行上打转。这个谬误必然是上吗的代码在运行时被看作是同一行,其概念如下:

var a = 1(function() {/* */})()

因而立刻函数的 () 被附加在 1 上,这是一个调用函数的语法,所以会产生 1 is not a function 的谬误,想要防止这个谬误就须要应用分号:

var a = 1 // 轻易把分号放在哪里,只有能隔开就行
;(function() {console.log(2)
})()

ASI 主动退出分号

ASI 是“Automatic Semicolon Insertion”的缩写,在运行时会往有些折行的代码中 主动插入分号,这个机制能够使局部代码在没有退出分号时也能失常运行,比方上面的例子:

var b = 1
++b
console.log('b', b)

因为代码中的 ++ 属于一元表达式,它只能在表达式的右边 左边搁置变量,如果没有 ASI 的机制,代码会被转换为 var b = 1 ++ b 这样的谬误语句。不过好在有 ASI,在理论运行时会主动被退出分号,也就不会呈现下面的谬误。

var b = 1;
++b;
console.log('b', b); // 2

return 与分号的关系

再来看一个例子,上面的代码在 return 的前面空一行后再写要返回的值,那么问运行后果是什么呢?

function fn() {
  return 
  '小明'
}
console.log(fn())

这段程序代码因为 ASI 的修改,return 的前面会被加上一个分号,所以 return 与预期返回的值被离开了,后果 return 的内容为空值,最终的后果也只能是 undefined

function fn() {
  return;
  '小明';
}
console.log(fn()); // undefined

到底应该怎么解决分号

原本 ASI 是出于一片善意,用来修改没有退出分号的代码片段,但偏偏在有的中央并没有施展它的作用(例如本文一开始所介绍的立刻函数),导致代码呈现了谬误;甚至有些代码不会出错,但会使你的代码执行后果和预期相差万里。

解决 ASI 问题的形式如下:

  • 无论如何都要加上分号,齐全由本人决定代码的宰割
  • 牢记不会主动退出分号的规定,当不会主动插入分号时,则手动退出

不会 被主动退出分号的规定

上面时各种 不会 主动退出分号的规定:

  1. 新行的代码是从 ([/ 字符开始的,这类状况个别会间接呈现 Uncaught TypeError 从而导致代码无奈运行。
var a = 1
var b = a
(a + b).toString()

var a = 1
[1,2,3].forEach(bar)
 
(function() {})()
(function() {})()
 
var a = 1
var b = a
/test/.test(b)
  1. 新行以 +-*% 开始,这类状况大多会影响运算后果,所以应该合并为一行。
var a = 2
var b = a
+a
  1. 新行以 ,. 开始,这种用法常常会呈现,次要是为了防止代码过长而退出的分隔,这种状况并不会影响运行,如果善用的话会使代码更容易浏览。
var a = 2
var b = a
  .toString()
console.log(typeof b)
 
var a = 1
,b = 2 // b 同样会被 var 申明

如果遇到须要退出分号的状况,除了能够在语句的开端退出分号外,也能够把分号加在“不会主动退出分号”的最后方,例如 () 自身不会主动退出分号,在有这种需要时能够将 ; 加到后面(ESLint Standard JS 标准就用这个办法防止谬误)。

// 运行谬误
(function() {})()
(function() {})()
 
// 正确
;(function() {})()
;(function() {})()

总结

有的人认为不加分号能够让代码看起来更洁净和精简,而且在大部分状况下并不会呈现谬误,所以很多人在敲代码时不会加分号。

不过我更偏向于更严格的标准,兴许是因为我是从后端转到前端的,习惯了。至于到底怎么选,只有搞清楚运行上的限度,不论哪种格调都是挺不错的,只有你喜爱就好。


本文首发微信公众号:前端先锋

欢送扫描二维码关注公众号,每天都给你推送陈腐的前端技术文章


欢送持续浏览本专栏其它高赞文章:

  • 深刻了解 Shadow DOM v1
  • 一步步教你用 WebVR 实现虚拟现实游戏
  • 13 个帮你进步开发效率的古代 CSS 框架
  • 疾速上手 BootstrapVue
  • JavaScript 引擎是如何工作的?从调用栈到 Promise 你须要晓得的所有
  • WebSocket 实战:在 Node 和 React 之间进行实时通信
  • 对于 Git 的 20 个面试题
  • 深刻解析 Node.js 的 console.log
  • Node.js 到底是什么?
  • 30 分钟用 Node.js 构建一个 API 服务器
  • Javascript 的对象拷贝
  • 程序员 30 岁前月薪达不到 30K,该何去何从
  • 14 个最好的 JavaScript 数据可视化库
  • 8 个给前端的顶级 VS Code 扩大插件
  • Node.js 多线程齐全指南
  • 把 HTML 转成 PDF 的 4 个计划及实现

  • 更多文章 …
正文完
 0