JavaScriptライブラリの先頭のセミコロンは何をしますか?


156

いくつかのJavaScriptライブラリでは、この表記を最初に見ました。

/**
 * Library XYZ
 */
;(function () {
  // ... and so on

「すぐに実行される関数」構文に完全に慣れている

(function(){...})()

先頭のセミコロンの目的は何なのかと思っていました。私が思いつくことができるすべてはそれが保険であることです。つまり、ライブラリがバグのある他のコードに埋め込まれている場合、それは「最後のステートメントが最後にここで終わる」一種のスピードバンプとして機能します。

他の機能はありますか?


回答:


140

複数のJavaScriptファイルを1つに安全に連結して、1つのHTTPリクエストとしてより速く処理することができます。


16
しかし、すべてのファイルが正しくコード化されれば、それは必要ではないでしょうか?
Boldewyn、2009

8
いいえ:あなたの例では、あなたはを得るでしょう(function(){...})()(function(){...})()
アーロンディグラ2009

8
つまり、「正しくコード化されている」ということは、すべてのライブラリが正しい量の末尾のセミコロンで終わることです...
Boldewyn

6
ええボルデウィン、しかしそれは単にそうではありません。
Mathias Bynens 09

13
2つの不適切にコード化されたファイルは、3番目のファイルにこのダーティフィックスが含まれているという事実だけでは適合しません。連結子が結果のファイル間にセミコロンを追加できないのはなぜですか?
デヴィッド・Horvathの

30

最良の答えは実際に質問で与えられたので、明確にするためにここにそれを書き留めます:

一流;適切で終了していない表現を含むファイルへの連結時にファイルを追加する際にエラーを防止するために、すぐに、呼び出される関数式の前に存在しています;

式をセミコロンで終了することをお勧めしますが、先頭のセミコロンも安全策として使用してください。


防御的なセミコロンを使用している場合、式もセミコロンで終了するのはなぜですか?すべての行の終わりにセミコロンがあることに依存する可能性を利用するか、防御的なセミコロンを使用します。両方を行うと、両方を行う理由があると誤って結論付けられます。防御的なセミコロンを使用することをお勧めします。またのすべてのインスタンス交換するアドバイス"\n"とは";\n"意味がありません。
Vladimir Kornea

4
@VladimirKornea:常に自分のライブラリだけを使用しているわけではないので:)
jvenema

@jvenemaそれが違いを生むと思う理由がわかりません。
Vladimir Kornea

6
あなたの慣習に従って他の誰かのコードに依存することができないからです。防御的にコーディングすれば、その必要はありません。
jvenema

1
@VladimirKornea必要に応じて、それも防御的であると考えることができます-防御的セミコロンで常に始まるとは限らない他の誰かのコードから防御します。
Nathan Hinchey 2017年

26

一般に、ステートメントが(、[、/、+、または-で始まる場合は、前のステートメントの継続として解釈される可能性があります。/、+、および-で始まるステートメントは、実際には非常にまれですただし、(および[で始まるステートメントは、少なくとも一部のスタイルのJavaScriptプログラミングでは珍しくありません。一部のプログラマーは、そのようなステートメントの先頭に防御的セミコロンを配置して、ステートメントが正常に機能し続けるようにするそれが変更され、以前に終了していたセミコロンが削除される前:

var x = 0 // Semicolon omitted here
;[x,x+1,x+2].forEach(console.log) // Defensive ; keeps this statement separate

ソース:

JavaScript:The Definitive Guide、第6版


9

これは、先行セミコロンと呼ばれます。

その主な目的は、問題を引き起こす可能性のある、不適切に閉じられた前のコードから自身を保護することです。セミコロンはこれが起こらないようにします。上記のコードが不適切に閉じられた場合、セミコロンがこれを修正します。正しく閉じられていれば、セミコロンは無害であり、副作用はありません。


7

1行の答えは、複数のJavaScriptファイルを安全に連結することです。セミコロンを使用しても問題は発生しません。

複数の関数があるとします。

IIFE 1

(function(){
  // The rest of the code
})(); // Note it is an IIFE

IIFE 2

(function(){
   // The rest of the code
})(); // Note it is also an IIFE

連結すると、次のようになります。

(function(){})()(function(){})()

ただし、関数の前にセミコロンを追加すると、次のようになります。

;(function(){})();(function(){})()

したがって、 ;こと、式が適切に終了していない場合に注意が必要です。

例2

変数を含むJavaScriptファイルがあるとします。

var someVar = "myVar"

いくつかの機能を持つ別のJavaScriptファイル:

(function(){})()

連結すると次のようになります

var someVar = "myVar"(function(){})() // It may give rise to an error

セミコロンを使用すると、次のようになります。

var someVar = "myVar";(function(){})()

4

JavaScriptコードを縮小すると良いでしょう。予期しない構文エラーを防ぎます。


どのような?セミコロンは次のコードに意味がありますか、それとも実際のライブラリの前にマージされた架空のバグのあるコードの意味ですか?
Boldewyn、2009

そのコードだけでは、特別な意味はありませんが、そのコードが他のコードの真ん中にあり、それを1行に縮小すると、(1)セミコロンが前の行にないなどの予期しないエラーが発生する可能性があります(1 )以前のものも関数なので、()()()()になります。エラーが発生した場合、デバッグが難しく、バグが多いとは言えません。
YOU

1
しかし、これを正しく処理するのは確かに縮小版の責任です。バギーミニファイナーは今日の標準ですか?
Vladimir Kornea
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.