違いはありません。
IIFE の原理を理解する必要があります。簡単に説明します。
IIFE は必要ありません。より伝統的に言うと、次のように記述できます。
では、なぜ IIFE なのでしょうか?
1. 従来の方法は面倒で、定義と実行が別々に記述されます。
2. 従来の方法は、グローバル名前空間 (ウィンドウなどのブラウザ内のグローバル オブジェクト) を直接汚染します
そこで、開発者は上記の問題を解決する方法を見つけたいと考えています。では、このように書いても大丈夫でしょうか?
関数 foo(...){}();
もちろんそうではありませんが、なぜですか? function foo(...){} の部分は単なるステートメントであるため、インタプリタにとっては、文字列「function foo(...){}」を記述したようなものであり、次のような解析関数を使用する必要があります。 eval() を使用して実行します。したがって、ステートメントの直後に () を置くと実行されません。これは間違った構文です。
それを正しくするにはどうすればよいですか?言うのは簡単で、ステートメントを式 (Expression) に変えるだけです。
実際、式を変換する方法はたくさんあります。最も一般的な方法は、関数宣言を () のペアで囲むことです。
これは次と同等です:
しかし、以前に書くことは不可能であると述べた方法は、実際には括弧で直接囲むことができます。これも等価な式です。
(関数 foo(){...}());
それでは、違いはあるのでしょうか?とてもシンプルです: いいえ~
さらに、式を変換する方法はたくさんあると先ほど述べたように、式を記述する方法も実際に他にもたくさんあります。
!function foo() {...}();
または
関数 foo() {...}();
これらはすべて問題ありません。
このキーワードには戻り値がないため、個人的には式の変換に void を使用することを好みます。でも、この点は本当にどうでもよくて、私を「亀」として扱ってください…
OK、いわゆるグローバル名前空間を汚染しないのは、IIFE が新しい関数スコープを作成し、実際のビジネス コードがその中にカプセル化されているため、当然グローバル オブジェクトには影響しません。グローバル オブジェクトが必要な場合は、IIFE に渡します:
私はここでシリーズを書きました。そのうちの 1 つは、IIFE を理解するのに役立ちます。http:// www.jb51 .net/article/75090.htm
方法 1、関数を呼び出して戻り値を取得します。関数を強制的に直接実行してから参照を返し、それが呼び出されて実行されます
方法 2、関数を呼び出して戻り値を取得します。強制演算子により、関数呼び出しが実行されます
(function(){})(); 関数を式として解析し、解析された関数
を実行します。
var a = function(){}; と同等 a() は関数
を取得します。
(function(){}()); 関数式を直接実行し、ステートメントとして実行します。
var a = function(){}(); と同等で、 a は結果
を取得します。
最終的な結果は同じです、
() は自己実行の役割を果たすだけです
()
のようなものは他にもたくさんあります
たとえば、関数 (){}
これは (function (){}) と同じです。一般に、(function (){}) にはグローバル変数