JavaScriptのすべての関数の後にセミコロンを使用する必要があるのはなぜですか?


282

さまざまな開発者がJavaScriptの関数の後にセミコロンを含めるのを見てきましたが、そうでないものもあります。ベストプラクティスはどれですか。

function weLikeSemiColons(arg) {
   // bunch of code
};

または

function unnecessary(arg) {
  // bunch of code
}

回答:


424

後のセミコロン関数の宣言がされている必要はありません

aの文法は、次のFunctionDeclarationように仕様で説明されいます。

function Identifier ( FormalParameterListopt ) { FunctionBody }

文法的にセミコロンは必要ありませんが、なぜだろうか。

セミコロンはステートメントを互いに分離するためのもので、a FunctionDeclarationステートメントではありません。

FunctionDeclarationsコードが実行に入る前に評価されます。巻き上げは、この動作を説明するために使用される一般的な言葉です。

「関数宣言」と「関数ステートメント」という用語は、ECMAScript仕様に記述されている関数ステートメントがないため、しばしば誤って交換可能に使用されますが、文法に関数ステートメントを含むいくつかの実装、特にMozillaがありますが、これも非標準です。

ただし、次のようにFunctionExpressions、セミコロンを使用する場合は常に推奨されます。

var myFn = function () {
  //...
};

(function () {
  //...
})();

上記の例の最初の関数の後のセミコロンを省略すると、完全に望ましくない結果が得られます。

var myFn = function () {
  alert("Surprise!");
} // <-- No semicolon!

(function () {
  //...
})();

2番目の括弧を囲む括弧Argumentsは関数呼び出しのと解釈されるため、最初の関数はすぐに実行されます。

推奨講義:


2
明確にするために編集されて、その記事は関数式
CMS

1
ECMAに完全に精通しているわけではありませんが、それも私が使用する標準です。良いポスト。私がオンラインで見ているほとんどのtutsと、DLがその標準を使用しているコードサンプルは、それに合わせただけです。
正規表現

1
ここでの混乱のいくつかは、「無視されるので許可される」という良い英語の単語の欠如に影響されている可能性があります。私たちは「オプション」と言っていますが、宣言の後にセミコロンを含めないことは、ステートメントの後にセミコロンを含めないことと同じカテゴリに分類されることを示唆しているため、誤解を招きます。後者は完全に異なる意味でオプションです。パーサーが省略したセミコロンを追加するためですが、この場合、パーサーは含めたセミコロンを無視するためです。別の言い方をすると、1つがオプションの場合は8つもオプションです。
セミコロン2014年

「名前付き関数式の詳細」リンクが無効なURLにリンクしました。Webアーカイブにはここにコピーがあります。web.archive.org
Tony

最後の例は素晴らしいものです。この場合、セミコロンを省略すると、非常に奇妙でデバッグしにくいバグが発生します。心から賛成投票。
Yan Yankowski

38

私はそれらを変数としての関数宣言の後に使用します:

var f = function() { ... };

しかし、古典的なスタイルの定義の後ではありません:

function f() {
    ...
}

NetBeansや他のIDEは、this.animaton_fun = function(){...};のように、変数としての関数の後にセミコロンを表示するのを好みます。
ランスクリーブランド

6
しかし-質問者のために- なぜですか?
ルーク、

ビルドステップ中に役立ちます。uglifierスクリプトがセミコロンを検出した場合、出力ファイルに改行を追加する必要はありません。追加しない場合は、改行が生成され、ファイルはわずかに大きくなります。
オートボクサー2018

20

JS Lintは事実上の規則であり、関数本体の後にセミコロンはありません。「セミコロン」を参照してください。


10
セミコロンがないために失敗した関数を直接目にしました。それを残すことは慣習であることに私は完全に同意しません。99.99%の時間は壊れませんが、IEがセミコロンなしでJavaScriptを実行できないことに気づいた特定の状況があります。
MillsJROSS 09

8
私の回答は、質問の2つの例のような関数定義のみを扱います。これらの場合、どのブラウザでも、どのような状況で、終了セミコロンは必要ありません。関数式を考えているのではないでしょうか。これらは完全に異なる問題であり、元の質問で取り上げられた問題ではありません。
David Hedlund、

var myFunction = function(arg){console.log(arg); }(function(){console.log( '完全に無関係な関数'); return '何が起こるかを見る';}());
Maciej Krawczyk 2017

@MillsJROSS私はDavidの返答に2番目です。遭遇した失敗について詳しく説明していただければ幸いです。確かにIEの関数式かバグか?
wlnirvana

7

一貫性を保つだけです!それらは必要ありませんが、ほとんどの縮小化手法はセミコロン(たとえば、Packer)に依存しているため、個人的に使用します。


5

本当にあなたの好み次第です。私はJava、C ++、C#などに慣れているため、コードの行をセミコロンで終了するのが好きなので、JavaScriptでのコーディングに同じ標準を使用します。

通常、関数の宣言はセミコロンで終了しませんが、それは私の好みです。

ブラウザーはどちらの方法でもそれを実行しますが、多分いつかはこれを管理するいくつかのより厳しい標準を思い付くでしょう。

私が書くコードの例:

function handleClickEvent(e)
{
     // comment
     var something = true;  // line of code
     if (something)  // code block
     {
        doSomething();  // function call
     }
}

1
行は間違いなくセミコロンで終了する必要があります。そうしないと、縮小版によって機能が完全に破壊される可能性があります
David Hedlund

9
@david:その場合、確かにミニファイアは壊れていますか?
DisgruntledGoat

同意した。これは、C / C ++のバックグラウンドから来た人(私のような)にとって自然なコーディング方法です。また、コードが読みやすくなります。
Anshuman Manral 2018

3

それは実際には慣習や一貫性の問題以上のものです。

すべてのステートメントの後にセミコロンを配置しないと、内部パーサーが遅くなります。これは、ステートメントの終わりがどこにあるのかを理解する必要があるためです。私はあなたがそれを明確に確認するためにあなたにいくつかの便利な数字があったらいいのですが、多分あなたはそれを自分でググることができます。:)

また、コードを圧縮または縮小する場合、セミコロンがないと、空白がすべてなくなるため、スクリプトの縮小版が意図したとおりに実行されない可能性があります。


3
質問は、セミコロンがすべてのステートメントではなく、関数の後にある必要があるかどうかに向けられました。すべてのステートメントの後にセミコロンを配置する必要があることに同意します。同じことを言う他のスタックオーバーフローのコンセンサスを見たことがあります。
macca1 2009

1
同意し、関数の後にセミコロンを付けないと、先ほど触れた縮小の問題が発生します。幸運を祈ります。
メイソン

ミニファイの問題を強化するための
賛成投票で

1

スクリプトを縮小したとき、等号で始まる関数にはセミコロンを使用する必要があることに気付きました。関数をvarとして定義する場合、はい、セミコロンを使用する必要があります。

セミコロンが必要

var x = function(){};
var x = new function(){};
this.x = function(){};

セミコロンは不要

function x(){}

0

シンプル:

;関数ブレースの終了後はセミコロンを残すことをお勧めします。彼らは何年もの間ベストプラクティスと考えられてきました。

常にそれらを使用する利点の1つは、JavaScriptを縮小したい場合です。

Javascriptを縮小するので、ファイルサイズを少し減らすのに役立ちます。

ただし、上記のベストプラクティスと回答については、関数タグの後に使用することはお勧めしません。

セミコロンを使用せず、縮小したい場合(多くの開発者が、サイトが多くのJavaScriptを提供している場合にそうしたいのと同じように)、あらゆる種類のエラー/警告を受け取る可能性があります。


0

関数の後にセミコロンを使用する必要がない場合でも、プログラムでエラーが発生することはありません。ただし、コードを縮小する場合は、関数の後にセミコロンを使用することをお勧めします。たとえば、次のようなコードがあるとします

//file one
var one=1;
var two=2;
function tryOne(){}
function trytwo(){}

そして

//file two
var one=1;
var two=2;
function tryOne(){};
function trytwo(){};

両方を縮小すると、出力として次のようになります

コメントは説明のためだけであることに注意してください

//file one
var one=1;var two=2;function tryOne(){}
function trytwo(){}

そして

//file two
var one=1;var two=2;function tryOne(){};function trytwo(){};
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.