2012-02-29 1 views
6

おそらく愚かな質問のビット。自己実行関数の構文とコールバックの構文が説明されている

しかし、私は自己実行機能と、それが持っているコールバックの構文は、他のすべてのJSの構文に非常に異なっている理由を理解したい。..

(function() { 
})() 

私だけに、なぜその有効理解する必要があります私は有効であるとことを推測して、コールバックのその後余分()なかったであろう()でそれをカプセル化し、(ちょうどそれの後に直接座っている、私も有効であるとことを期待しなかったであろう。

されています誰でもこのことを私に説明できますか?

+0

[JavaScriptの匿名関数はどのように機能するのですか?](0120-18752) – ziesemer

+0

代替方法すべてのかっこを避ける同じことをすることは、 'new function(){...};'です。 Newはあなたのために関数を呼び出します。 – jpsimons

+0

@darkporter:主な違いの1つは、 'new function(){...}'が関数*をコンストラクタ*として呼び出すことです。したがって、 'this'は内部で異なり、式は' function(){...} 'が返すものではなく、新しく作成されたオブジェクトに評価されます。 (私はあなたがすでにこのことを知っていると思っていますが、そうでない人の利益のために明示的にする価値があると思います!) – ruakh

答えて

14

function (...) {...}の部分は、の関数式です。つまり、関数を表す式です。この場合、カッコで囲まなければならない唯一の理由は、キーワードfunctionがステートメント内の最初のものである場合、ステートメントはファンクションステートメント、つまり関数宣言であるとみなされることです。実際には、必ずしも括弧で囲む必要はなく、接頭辞として+を付けるか、または一般的にどんな種類のトークンを入れてもかまいません(function)。

関数式の後の()部分は、関数を呼び出すための通常の()と同じです。これ:

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

は(脇一時変数から)これと同じである。

var f = function (...) {...}; 
f(); 

これに相当する:

function f(...) {...}; 
f(); 
+0

ありがとう皆、感謝ruakh。私はあなたの言うことを持っています。関数が実際に宣言することができる3つの方法を、こんにちはが理解していると思います。 – Baconbeastnz

2

本質的に外側の括弧は、関数オブジェクトを許しますこれらの括弧のスコープを終了すると、関数オブジェクトを呼び出す準備が整います。

2

はここを参照してください:あなたが行ったように宣言するとき、あなたは関数式(上記のリンクから関数を定義する第三の方法)として、それを使用している

。任意の式と同様に、この(expression)は式に評価されます - ここではかっこが使用されますが、必要な場合は優先順位が確立されます。

var f = function(a) { 
    var s = ((((1)))) + ((((a)))); 
    console.log(s); 
}; 

(((((f))))) (2); 

live example)をしてから(基本的に、1 + 2 = 3の印刷で)同じ結果とすべての不要な括弧を削除します。だから、たとえば、これを書くことができます。結果:

(function(...) { ... }) 

は、いくつかの引数を受け取り、実行するボディを持つ関数です。この:

(function(...) { ... })() 

はにほとんど同等です:

var f = (function(...) { ... }); 
// Now f is a function that can be called 
f(); 

無名関数は、2つの理由のために、とりわけ有用である - 彼らは匿名である(すなわち、それらは追加の名前を作成しない - を参照して、再び上記のSOqリンク)、それらはグローバルにする必要のない他のもののための「コンテナ」です。

0

ここには、IFFE(read iffy)とも呼ばれる即時呼び出し関数式があり、JS関数スコープを使用してレキシカルスコープを生成するデザインパターンです。これらは、可変ホイストを回避し、地球環境を汚染し、同時に機能に宣言された変数のローカルプライバシーを保持しながら、メソッドへのアクセスを許可します。 これを理解するための鍵は、JSが機能スコープを持ち、スコープをブロックせず、クロージャ内の参照によって値を渡すということです。 Immediately-invoked function expressionで詳しく読むことができます。