共计 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 问题的形式如下:
- 无论如何都要加上分号,齐全由本人决定代码的宰割
- 牢记不会主动退出分号的规定,当不会主动插入分号时,则手动退出
不会 被主动退出分号的规定
上面时各种 不会 主动退出分号的规定:
- 新行的代码是从
(
、[
、/
字符开始的,这类状况个别会间接呈现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)
- 新行以
+
,-
,*
,%
开始,这类状况大多会影响运算后果,所以应该合并为一行。
var a = 2
var b = a
+a
- 新行以
,
或.
开始,这种用法常常会呈现,次要是为了防止代码过长而退出的分隔,这种状况并不会影响运行,如果善用的话会使代码更容易浏览。
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 个计划及实现
- 更多文章 …