最近まで、私はすぐに実行される関数がこの構文を持つことしか知りませんでした:
(function(){
…
})();
それから私は図書館を見ていました、そして見つけました:
! function(){
…
}();
2つの同等のアプローチですか?つまり、実行の観点からは同じ結果になるのでしょうか?
最近まで、私はすぐに実行される関数がこの構文を持つことしか知りませんでした:
(function(){
…
})();
それから私は図書館を見ていました、そして見つけました:
! function(){
…
}();
2つの同等のアプローチですか?つまり、実行の観点からは同じ結果になるのでしょうか?
このブログ投稿では、一般的な概念について非常に徹底的に説明しています。
この質問を開始したとき、「自己実行」という用語は、他のコンテキストで見たときに知っていたものでしたが、調査中に、実行が関数本体の外部で発生するため、より正確な「即時に呼び出される」という用語を発見しました。他の人を助けるために、質問に「自分」を残しました。
演算子の前処理が機能する理由に興味がある場合は、「Javascript Self Executing expected to work?」に対するこの回答を確認してください。これは、「JavaScript のカプセル化された匿名関数の構文を説明する」に対するこの回答と同様に詳しく説明しており、すぐに実行するための関数のカプセル化に関する有用な情報も含まれています。
パフォーマンスの観点から、このブログ投稿「Self-Invoking Functions」では!
、、、、、、演算子と括弧を比較-
しています。違いはごくわずかであるように見えるので、おそらく読みやすさが優先されます: 著者が述べているように.+
~
void
delete
it is still recommended to use the parentheses or a bang [!] because they are programming conventions
演算子を先行させることの明らかな効果の 1 つは、各演算子が戻り値の型に影響を与える方法ですが、代入を介して戻り値をキャプチャしている場合 (即時呼び出しではこれが唯一の方法のようです)、次のように演算子を省略できます!
。代入演算子により、パーサーは関数をすぐに実行できます。var capture = function(){ return 'capture this' }();
もう 1 つのエッジ ケースは、new
括弧を使用してキーワードを使用できますが、演算子を前に使用する場合は使用できません。この質問を参照してください。 JavaScriptで?new
これには、実行中の括弧の配置との使用がカプセル化の動作をどのように変更できるかを明らかにする興味深い答えがあります。