24

重複の可能性:
JavaScript: 中括弧の後にセミコロンを使用する必要があるのはいつですか?

関数宣言の後に誰かがセミコロンを追加しましたが、誰かが追加しませんでした。関数宣言の後にセミコロンを追加するのは良い習慣ですか?

function test(o) {
}

function test(o) {
};
4

6 に答える 6

39

関数宣言には、その後にセミコロンを付ける必要はありません (また、付けるべきではありません)。

function test(o) {
}

ただし、以下の変数初期化子のように関数をとして記述する場合は、他のステートメントと同様に、ステートメントをセミコロンで終了する必要があります。

var a = function test(o) {
};

コンストラクターと宣言(ステートメント)と式の詳細を参照してください。

于 2012-08-15T23:29:51.937 に答える
5

そこで実際に起こっているのは、関数の後に空のステートメントを追加していることです。

function test (o) { return o; };

次のように見える可能性があります。

var test = 0;;

その 2 番目のセミコロン自体はエラーではありません。ブラウザはそれを、まったく何も起こらなかったステートメントのように扱います。

ここで注意すべき点が 2 つあります。

これは、関数宣言と制御ブロック (for/if/while/switch/etc) にのみ適用されます。

関数宣言はスコープの最後で定義する必要があるため、次のような問題に遭遇することはありません。

function test () {}
(function (window, document, undefined) { /* do stuff */ }(window, document));

function test() {}(/*return value of closure*/); ブラウザーは、どちらがエラーであるかを意味していると想定するためです。非常に見落としやすい非常に悪い厄介なエラーです。

しかし、それは問題ありません。なぜなら、関数宣言は return ステートメントの下に置くことができ、それでも問題なく機能するからです。

だからあなたが行きたかったとしても:

function doStuff () {
    return (function () { /*process stuff*/ test(); }());
    function test () {}
}

それはちょうどピーチでうまくいくでしょう。

于 2012-08-16T00:11:13.603 に答える
4

セミコロンと関数宣言:

function test(o) {
    // body
} // semicolon no

var test = function (o) {
    // body
}; // semicolon yes

コードの質問の書式設定については、 JSLintを参照してください。

于 2012-08-15T23:30:04.910 に答える
3

いいえ。

そのような関数を定義するとき、セミコロンは必要ありません。

ただし、次のような関数を定義すると:

var test = function (o) {
}

厳密には必要ではありませんが、特に関数を 1 行に配置する場合は、それらを使用することをお勧めします。

最初の方法は関数を定義しますが、2 番目の方法は関数を変数に代入するため、ステートメントになります。ほとんどのステートメントはセミコロンで区切られています。関数の定義は、多くの人が使用していないため、一般的な反例と見なすことができます。

于 2012-08-15T23:28:15.103 に答える
1

ブラウザにとって、それは問題ではありません。セマンティクスの問題については、関数のプロトタイプを作成しているか、関数ステートメントを使用しているかだけが重要です。

function stuff(stuff) {
     alert(stuff);
} //don't need a semicolon

Object.prototype.stuff = function(stuff) {
    alert(stuff);
}; //need a semicolon
var stuff = function(stuff) {
    alert(stuff);
}; //need a semicolon
于 2012-08-15T23:30:07.737 に答える
0

関数の定義時にセミコロンは必要ありませんが、セミコロンを付けることも間違いではありません。

ただし、1つの例外として、関数ラッパーを使用してパラメーターを渡す場合は、間にセミコロンを追加する必要があります。例:

(function(v){alert(v)})('1');
(function(s){alert(s)})('0')

... Otherwise forget about them ...

于 2012-08-15T23:55:48.540 に答える