摘要: JavaScript語言從設計之初就是考慮帶分號的,使用不帶分號的編碼規則就要當心點啦。小程序
最近在項目中開始使用新的編碼規範,一開始ESLint報一大堆錯誤,改得我想砸鍵盤,花了好些時間才適應,下面列出一些表明性的規則:微信小程序
function(args) { .. }
import { fa, fb } from moduleC
早上在實現一個功能的時候,寫了一個map
函數來複用部分代碼。程序運行起來後,沒有執行結果,並且沒有報錯。經過console.log打印數據發現,整個程序執行到map前面就不再往下走了,很奇怪。由於沒有報錯信息,沒法推測具體緣由。因而,我將其抽象成很是簡單的代碼來排查。以下所示:數組
console.log("hello, fundebug") [1, 2, 3].map(i=>console.log(i))
而後執行看看結果如何:瀏覽器
在項目中沒有報錯,單獨將這段代碼拿出來在瀏覽器控制檯下執行卻報錯了! 這麼簡單的代碼爲何會出錯呢?第一反應就是JS引擎將代碼生成語法樹的時候,可能解析不正確。因而,我在第一行末尾加分號測試。安全
console.log("hello, fundebug"); [1, 2, 3].map(i=>console.log(i))
程序正確執行了: 這讓我更加犯難,若是不加分號會致使程序出錯,那麼爲何還會推崇這樣的編碼規範呢? 在網絡上搜索JavaScript關於分號的BUG,發現有很是多關於要不要使用分號的討論。微信
引用minhan在扯不完的 JS 分號問題文中的論述:網絡
JSON、JSLint、JSMin和ADSafe 的創造者、ECMA JavaScript 2.0 標準化委員會委員、被JavaScript之父Brendan Eich稱爲JavaScript的大宗師、名著《JavaScript: The Good Parts》(中文版《JavaScript語言精粹》)的做者Douglas Crockford直接懟之: 這代碼真尼瑪的瘋狂傻X,我是不會爲了這傻X的案例而去下降JSMin的級數; TC39正在考慮將『!』號做爲中綴運算符使用,這個代碼不久未來就運行不了。趕忙修復吧,學學怎麼正確地使用分號。『!』號並不語句的分隔號,『;』纔是。函數
JSMin處理以下代碼後沒法正確執行:post
clearMenus() !isActive && $parent.toggleClass('open')
JavaScript有着自動分號插入的機制(Automatic Semicolon Insertion),簡稱ASI。這是一個輔助性的功能,而後有一些狀況要注意:測試
若是你這樣寫代碼:
return a + b
那麼自動分號插入後會這樣:
return; a + b;
更可能致使隱含BUG的情況是:
a = b + c (d + e).print()
他不會自動插入分號,由於第二行一括號開始,會被誤認爲是函數。
a = b + c(d + e).print();
因此,我剛剛的的代碼在自動插入分號後,應該是這樣:
console.log("hello fundebug")[1,2,3].map(i=>console.log(i))
那麼這樣看來,用分號纔是最安全的作法咯!
若是你不想用分號,又怕出問題,v2ex上有位童鞋給出了一個速記方案:
若是你寫 JS 代碼不喜歡帶分號,而又搞不清何時必須加分號,能夠這麼作:在以 "("、"[" 、"/"、"+"、"-" 開頭的語句前面都加上一個分號。
我最終的解法是先聲明一個變量來指向這個數組,這樣就能夠避免以[
開頭,又不使用分號:
let indexArray = [1, 2, 3] indexArray.map(i=>console.log(i))
Fundebug專一於JavaScript、微信小程序、微信小遊戲、支付寶小程序、React Native、Node.js和Java實時BUG監控。 自從2016年雙十一正式上線,Fundebug累計處理了6億+錯誤事件,獲得了Google、360、金山軟件等衆多知名用戶的承認。歡迎免費試用!
轉載時請註明做者Fundebug以及本文地址: https://blog.fundebug.com/2018/09/18/js-semicolon-bug/