これら 2 つのコード スニペットの意味上の違いは何ですか?
例 1
var x = (function () {} ());
例 2
var x = (function () {} )();
()
記述上の違いは、JavaScript インタープリターにコード ブロックを一度に実行するように指示する括弧のペアを配置する場所です。技術的には、違いはありません。質問の言い回しを言い換えて「セマンティック」という言葉を削除する場合、新しい質問はすでに回答されており、ここで詳しく説明されています: https://stackoverflow.com/a/6645915/1268003
しかし、セマンティック部分は私のジレンマであり、このスレッドが光を当てることができることを願っています. それは「セマンティック」であるため、客観的な答えはありません.StackoverflowのFAQによると、私の質問は有効ではないという境界線上にあります. ただし、コメントで発生する可能性のあるこの質問の有効性については議論できます。とりあえず、先に進みましょう。
問題の定義
そこにいるすべてのJavaScriptユーザーの絶対的な大多数example 2
は、を使用しているようです。実際、私はまだその規則の例外を 1 つも見つけていません (または、最近どこに行ったのでしょうか?)。特に jQuery プラグインの開発者は、次のようにコードを記述します。
例 3 (例の例を参照)
(function ($) {} )(jQuery);
私のバイブルであるJavaScript: The Definitive Guideでは、この慣行はまったく使用されていません。著者の David Flanagan はこれに固執していexample 1
ます (ページ 249 は、著者がこの慣行についてコメントしている場所です)。
どの構成を気にする必要はありません。追加された括弧にはすべて、読みやすさを最大化するという 1つの目的しかありません。明確にする。それでは、何を明確にしますか?
私の推理
JavaScript でクロージャを記述する場合、外部のコードからアクセスできないと想定されている関数でローカル変数を定義しています。ほとんどの場合、コンテキストにより、関数は識別子にバインドされていない匿名関数です。そのようです:
例 4
function () { var local = "Local variable!"; }
繰り返しますが、コンテキストと通常の慣習により、コードのスニペットを一度に実行したいと考えています。そのため、いくつかの括弧を挿入します。これにより、JavaScript インタープリターに関数を実行するように指示されます。
例 5
function () {} ()
コードでこれを明確にするために、いくつかの括弧を追加することをお勧めします。これにより、クロージャーも明確になります。
例 6
(function () {} ())
これは の正確なレプリカですexample 1
。したがって、私の推論でexample 1
は、それがコードを「書くべき」方法であると言えます。を使用することを選択するときはいつでもexample 2
、匿名関数がすぐに実行されるという事実ではなく、クロージャーの使用のみを明確にします。しかし、コード スニペット全体の外側に明確化括弧を配置するための最小限の努力で、両方をキャッチできます。
はい、私は自分の推論を批判できます。ではexample 3
、「ねえ、外部参照が内部のエイリアスにコピーされている」と考えるのは魅力的です。別の方法:
例 7
(function ($) {} (jQuery))
..この点に関しては明確ではありません。ただし、example 2
この値渡し手法は使用しません。個人的には、私がクロージャを書くとき、ほとんどの場合、何も渡す必要はありません。それでも、原理主義者であることを許されるとしても、jQuery プラグインの実践では、匿名関数の即時実行が明確になることはありません。
例 1 ユーザー
私の推論が正しいとすれば、コミュニティ全体が を使用するのはなぜexample 1
ですか? 2 つの説明のうちの 1 つだけをキャストするという彼らの唯一の意図はありますか? ひょっとしたら、彼らには目的すらなく、私たちが説明できない目的の単なる伝統に従っているのではないでしょうか? 私はまだ jQuery プラグインを作成したりexample 2
、聖書を読んでキャリアを始めたので使用したりしていません。example 1
しかし、あなたがそれを使用し、その理由を持っている多くの人の中にいる場合は、共有してください =)