背景
在寫自動執行函數時
vm.$watch('datas', function() { console.log(vm.datas); }) (function () { console.log('test'); })()
出現莫名錯誤:
Uncaught TypeError: vm.$watch(…)(…) is not a function
解決方法:
vm.$watch('datas', function() { console.log(vm.datas); ); (function () { console.log('test'); })()
一個分號搞定。
自此,又引出 JavaScript 代碼中要不要加分號的經典話題
分號
在 C 語言中,分號是語句結束的標志,在語句結束的地方一定要以分號結束。而 JavaScript 的分號卻是可選的,若語句都各占一行,則可以省略分號。
ASI 機制(Automatic semicolon insertion)
JavaScript 中的 ASI 機制,允許我們省略分號。ASI 機制不是說在解析過程中解析器自動把分號添加到代碼中,而是說解析器除了分號還會以換行為基礎按一定的規則作為斷句的依據,從而保證解析的正確性。
ASI 規則
- 新行並入當前行構成非法語句時,自動插入分號
-
continue,return,break,throw后自動插入分號return => return;
a+b a+b; ++,--后綴表達式作為新行開始,會在行首自動插入分號- 代碼塊的最后一個語句會自動插入分號
注意
- 新行以
([/+-*%,.開始,很容易與上一行未加分號的代碼成整體而一起解析,這明顯不是我們想要的結果
結論
為增強代碼可讀性,減少歧義,個人意見是在語句結束時加上分號
PS:
- 不要將
++或--放在同一行 - 如果
return后有參數,不要將參數放在獨立的行 - 不要將括號的開始放在新的一行,理由為上一條
