最初に
JavaScriptにはセミコロンを省いても自動で文を解釈して実行してくれるという特性があります。
そのため以下は等価となります。
var a
a = 1
console.log(1) // 1
var b;
b = 1;
console.log(1); // 1
もちろんエラーも起こりません。
そんな特性を持っているためか、ライブラリなどでたまに先頭にセミコロンをつけてから始めているものもちらほら見受けられます。
どんなことが起こるのか知ってますか
そんな特性を持っていて、ライブラリなどにセミコロンをつけないとどんなことが起こるのか、また、セミコロンがないときの文の解釈を簡単にまとめてみました。
試してみました
代入
まずは基本的な代入。そのままa=1として解釈されます。
a
=
1
console.log('a=' + a) // a=1
//以下上記と等価
a = 1;
計算結果を代入。b=b1+b2として解釈されます。
var b1 = 1, b2 = 2
b
=
b1
+
b2
console.log('b=' + b) // b=3
//以下上記と等価
b = b1 + b2
インクリメント
インクリメント演算子で1足してみると驚きの結果。後ろにあるdの方が足されます。引いてみても後ろの変数が引かれます。
c = 1, d = 1
c
++
d
console.log('c=' + c) // c=1
console.log('d=' + d) // d=2
// 以下上記と等価
c;
++d;
関数
関数で計算結果を返すものを混ぜてみます。
function fun(x1, x2) {
return x1 * x2
}
関数の引数部分が別れてもしっかり解釈してくれるようです。
var e1 = 1, e2 = 2
e
=
e1
+
e2
+
fun
(2,5)
console.log('e=' + e) // e=13
// 以下上記と等価
e = e1 + e2 + fun(2,5)
エラー発生
さてここからが問題です。下記のように下の文に(が続くと、上の文の引数部分として解釈されるようです。
f
=
fun(1,2)
(function() {
console.log('function!')
}());
// Uncaught TypeError: fun(...) is not a function
// 以下上記と等価
f = fun(1,2)(function() {
console.log('function!')
}());
なので例え値を持った変数が(の上の文だとしても関数だと解釈されエラーが発生します。
var f1 = 1
f
=
f1
(function() {
console.log('function!')
}());
// Uncaught TypeError: f1(...) is not a function
// 以下上記と等価
var f1 = 1;
f = f1(function() {
console.log('function!')
}());
ちなみにreturnも行を分けると、その下の文が何であろうと実行されないので注意
function ret() {
return
1
}
console.log(ret()) // undefined
結果
セミコロンは絶対つけましょう。
影響範囲を探す手間を考えればつけないという選択肢はないです。