4

これら2つの違いは何ですか:

(function () {
    alert('something');
})();​  # invocation parens after the wrapping parens

(function () {
    alert('something');
}());  # invocation parens inside the wrapping parens

—どちらも同じ結果をもたらします。「何か」を警告します。

4

3 に答える 3

10

違いはありません。どちらもまったく同じことを行います (無名関数式を呼び出します)。

無名関数を括弧で囲んでいるのは、関数が宣言ではなく式として解析されるようにするためです (宣言を呼び出すことができないため、これは重要です)。同じ効果を得るために他の演算子が使用されている場合もあります。例えば:

// All three of the following have the same effect:

!function () {
    alert('something');
}();​

+function () {
    alert('something');
}();​

(function () {
    alert('something');
}());​

JSLint のような静的分析ツールを使用すると、質問の最初のフォームについて不平を言う可能性があることに注意してください (グループ化演算子の外側に括弧を呼び出します)。これは、2 番目の形式の方が理解しやすいと考える人がいるからです。

于 2012-11-30T11:58:53.330 に答える
3

JSLintは、})();呼び出しを「間違った」ものとして扱います。関数の定義呼び出しは、単一の式の一部です。その理由だけで、呼び出しが式自体の一部であるのは非常に論理的です。

本質的に、それは個人的な好みの問題です。個人的には

(function(elem)
{
})(document.getElementById('foo'));

より読みやすい

(function(elem)
{
}(document.getElementById('foo')));

しかし、繰り返しになりますが、構文が強調表示されているエディターは、その引数を無効にします。
結論:最も快適に感じるものを使用し、jslintにそれについて口説いてもらいましょう。ダグラス・クロックフォードはJSに関しては権威ですが、それは私たち全員が彼のスタイル/推論を盲目的にコピーしなければならないという意味ではありません

于 2012-11-30T12:05:10.957 に答える
0

(JSで)何かを括弧で囲むと、インタプリタはそれを式として扱うように強制されます。

最初のケースでは、インタプリタに関数を式として処理するように強制します。次に、インタプリタはそれを評価し、それが関数であると結論付けてからさらに調べ()ます。したがって、関数を呼び出します。

2番目のケースでは、インタプリタに呼び出し側の親を式として処理するように強制します。したがって、関数呼び出しの結果は、何かを返す場合は式の結果になります(そうでない場合は未定義になります-Elias van Ootegemに感謝します) 。

于 2012-11-30T12:03:27.190 に答える