オブジェクトを初期化するときの追加の括弧の重要性は何でしょうか。例えば:
var foo = function(){ ... }();
対
var foo = (function(){ ... }());
私はスコープに関連する何かを想定していますが、どちらも各無名関数が返すものに基づいてオブジェクトを初期化するように見えるので、誰かが特定の違いについてより正確にできるかどうか疑問に思いました。
オブジェクトを初期化するときの追加の括弧の重要性は何でしょうか。例えば:
var foo = function(){ ... }();
対
var foo = (function(){ ... }());
私はスコープに関連する何かを想定していますが、どちらも各無名関数が返すものに基づいてオブジェクトを初期化するように見えるので、誰かが特定の違いについてより正確にできるかどうか疑問に思いました。
その特定のケースでは、効果的な違いはありません。
関数が呼び出されていることをオペレーターの(...)
近くに視覚的に示唆するため、アウターが好きな人もいます。=
ただし、代入演算子を使用すると、は代入演算子function
の右辺のオペランドである式として評価されるため、関数宣言からそれを強制する必要なしに呼び出すことができます。
function
割り当てがない場合、キーワードが無名関数式として使用されていることをインタプリタに知らせる構文が必要です。
例えば...
(function() {
// code
})();
ここで、括弧はのあいまいさを解決し、グループfunction
内の単一の式として扱われるようにしました。(...)
グループ化演算子はfunction
、を式として評価するように強制する1つの方法にすぎません。ほとんどのJavaScript演算子は、この目的に使用できます。単項演算子はおそらく最も安全です、例えば...
!function() {
// code
}();
...また...
void function() {
// code
}();
どちらの場合も、function
はそれぞれの演算子の単一のオペランドと見なされます。
どちらも機能的には同等です。
ただし、慣例として、多くのプログラマーは、varが関数自体ではなく、関数の結果であることを示すために開き括弧を好みます。
自己呼び出し関数の使用は、変数を渡して「名前空間」を保持することです。たとえば、ウィンドウやドキュメント、またはjqueryなどの他のものを渡すのが一般的です。
jslintでのいくつかの簡単なテストによると、そうするための好ましい方法は、次のテストの最初(foo)です。
var foo = (function () {}());
var bar = (function () {})();
var baz = function () {}();
呼び出し()は外側の括弧の内側にあることに注意してください。
JSLintは、barとbazに対して次のエラーを出します
エラー:
2行目の文字28の問題:呼び出しを関数を含むparensに移動します。
var bar =(function(w){})(window);
3行目の文字27の問題:式が関数自体ではなく関数の結果であることを読者が理解できるように、即時関数呼び出しを括弧で囲みます。
var baz = function(w){}(window);
私の知る限り、これは単なる慣例であり、絶対に必要というわけではありません。
これは、この規則が役立つ理由についての良い投稿です。
http://peter.michaux.ca/articles/an-important-pair-of-parens