ホームページ >ウェブフロントエンド >jsチュートリアル >js は関数をすぐに実行します: (function ( ){})( ) と (function ( ){}( )) の違いは何ですか?_javascript スキル

js は関数をすぐに実行します: (function ( ){})( ) と (function ( ){}( )) の違いは何ですか?_javascript スキル

WBOY
WBOYオリジナル
2016-05-16 15:31:191074ブラウズ

違いはありません。

IIFE の原理を理解する必要があります。簡単に説明します。

コードをコピーします コードは次のとおりです:

function foo() {...} // これは定義、宣言です。この定義はインタプリタにその存在を知らせるだけですが、実行されません。
foo(); // これはステートメントです。ステートメントに遭遇するとインタプリタがそれを実行します。

IIFE は必要ありません。より伝統的に言うと、次のように記述できます。

コードをコピーします コードは次のとおりです:

function foo() {...}
foo();

では、なぜ IIFE なのでしょうか?
1. 従来の方法は面倒で、定義と実行が別々に記述されます。
2. 従来の方法は、グローバル名前空間 (ウィンドウなどのブラウザ内のグローバル オブジェクト) を直接汚染します

そこで、開発者は上記の問題を解決する方法を見つけたいと考えています。では、このように書いても大丈夫でしょうか?

関数 foo(...){}();

もちろんそうではありませんが、なぜですか? function foo(...){} の部分は単なるステートメントであるため、インタプリタにとっては、文字列「function foo(...){}」を記述したようなものであり、次のような解析関数を使用する必要があります。 eval() を使用して実行します。したがって、ステートメントの直後に () を置くと実行されません。これは間違った構文です。

それを正しくするにはどうすればよいですか?言うのは簡単で、ステートメントを式 (Expression) に変えるだけです。

実際、式を変換する方法はたくさんあります。最も一般的な方法は、関数宣言を () のペアで囲むことです。

コードをコピーします コードは次のとおりです:

(function foo() {...}) // これは意図的な改行であり、実際には次の括弧で接続できます
();

これは次と同等です:

コードをコピー コードは次のとおりです:

var foo = function () {...} // これは定義ではなく式です。
foo();

しかし、以前に書くことは不可能であると述べた方法は、実際には括弧で直接囲むことができます。これも等価な式です。

(関数 foo(){...}());

それでは、違いはあるのでしょうか?とてもシンプルです: いいえ~

さらに、式を変換する方法はたくさんあると先ほど述べたように、式を記述する方法も実際に他にもたくさんあります。

!function foo() {...}();

または

関数 foo() {...}();

これらはすべて問題ありません。

このキーワードには戻り値がないため、個人的には式の変換に void を使用することを好みます。でも、この点は本当にどうでもよくて、私を「亀」として扱ってください…

コードをコピーします コードは次のとおりです:

void 関数 () {
//これが本当に必要なコードです
}();

OK、いわゆるグローバル名前空間を汚染しないのは、IIFE が新しい関数スコープを作成し、実際のビジネス コードがその中にカプセル化されているため、当然グローバル オブジェクトには影響しません。グローバル オブジェクトが必要な場合は、IIFE に渡します:

コードをコピーします コードは次のとおりです:

void 関数 (グローバル) {
//ここで、global はグローバル オブジェクトです
}(this) // ブラウザでは、これはウィンドウ オブジェクトです

私はここでシリーズを書きました。そのうちの 1 つは、IIFE を理解するのに役立ちます。http:// www.jb51 .net/article/75090.htm

方法 1、関数を呼び出して戻り値を取得します。関数を強制的に直接実行してから参照を返し、それが呼び出されて実行されます
方法 2、関数を呼び出して戻り値を取得します。強制演算子により、関数呼び出しが実行されます
(function(){})(); 関数を式として解析し、解析された関数
を実行します。 var a = function(){}; と同等 a() は関数
を取得します。 (function(){}()); 関数式を直接実行し、ステートメントとして実行します。
var a = function(){}(); と同等で、 a は結果
を取得します。 最終的な結果は同じです、
() は自己実行の役割を果たすだけです
()
のようなものは他にもたくさんあります たとえば、関数 (){}
これは (function (){}) と同じです。一般に、(function (){}) にはグローバル変数

を避けるという別の効果があります。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。