ご想像のとおり、匿名関数をすぐに実行するには多くの方法があります。要約すると、次の 3 つの典型的な方法があります (他の方法もありますので、お知らせください)。
方法 1
(関数() {
//…
})();
方法 2
void 関数() {
//…
}();
方法 3
~関数() {
//…
}();
方法 1 と方法 2 は見たことがあると思います。ここでは主に方法 3 について説明します。 3 番目の方法を説明する前に、EMCAScript (第 5 版の 72 ページ) の演算子「~」(ビット否定) の定義を簡単に翻訳して確認します。
ステートメントと演算子を組み合わせて、古い値を 32 ビット整数に変換します。演算子の後にステートメントを実行し、行を変換します。結果は 32 ビット整数として返されます。
上記からわかるように、実際、ビット演算子は次の式の値を即座に返すことができます。実際、次のような他のビット演算子でもこの目的を達成できます。
!関数() {
//…
}();
などで目標を達成できます。したがって、実際には「~」を使用する他の理由はなく、コードが「見栄えが良い」というだけです :^)
効率は、匿名関数を 3 つの方法で実行する効率よりも、各演算子の実行効率を直接分析する方が良いでしょう。それでは、EMCA仕様における「()」と「void」の定義を比較して見てみましょう。
グループ オペレーター (第 5 版、66 ページ)
式の実行結果を返します。
ボイド(第5版、70ページ)
ステートメントと演算子を組み合わせると、未定義が返されます
グループ演算子もステートメントを実行し、ステートメント ブロックによって返された値を返す必要があるため、void と比較すると、ステートメント ブロックを取得するために複数の操作が必要になります (ただし、パフォーマンスはあまり消費されません)。 void の方が group 演算子よりも優れています。
2 つを比較すると、方法 3 のパフォーマンスの比較は、最初の 2 つよりも明らかに低くなります。要約すると、文法の観点から、上記の 3 つの無名関数メソッドのうち、メソッド 2 はメソッド 1 よりも優れており、メソッド 3 は最も効率的ではありません。
3 つの利点を要約して考えます
方法 1 は非常に一般的で安全なので、この方法を使用することを誰も責めません。ただし、方法 1 を使用する生徒は、括弧の一致を忘れるという「問題」を頻繁に起こす可能性があります (特にステートメント ブロックが非常に長い場合)。よく間違えます)
ビットごとの演算子を使用して匿名関数を実行することは非常に流行しており、多くの IDE (IDEA など) や構文強調表示ツールは 3 番目の記述方法をサポートしていません。
void が最も効率的ですが、他の 2 つの実装に比べて常に非常に肥大化しているように感じられます (文字数がほんの少し多いだけですか?)。
それで
コード量と効率を考慮すると、余分なコードを節約する必要がある場合は方法 1 を使用し、効率を優先する場合は方法 3 を使用するのが正しいです。そこで、ここでは方法 2 の使用について説明したいと思います。実際、3 つの方法の効率の差は非常に小さいです。したがって、効率のみに基づいてその方法を使用することはほとんど支持できません。
具体的にどのような計画を採用するかは、実情に応じて検討する必要がある。たとえば、私がよく使用する方法 3 の理由は、 1. 便利 (1 文字追加するだけ) 2. 関数が長いときに括弧を合わせるのがめんどくさい 3. 使うとかっこいいが、方法 3 はよく見てしまう コード チームのメンバー困っています。
一部のクラス ライブラリなどのフレームワーク ベースの基本コードがある場合は、方法 1 を使用するのが最も安全で誰にとっても理解しやすいため、最も安全な選択です。
[原文: http://www.gracecode.com/archives/3004/非常に優れており、誰もがそこから学ぶことができます