2009-08-27 12 views
5

以下のJavaScriptはどういう意味ですか?関数が()内に埋め込まれているのはなぜですか?このような奇妙なJavaScript構文:(function(){// code})();?

(function() { 
    var b = 3; 
    a += b; 
})(); 
+0

ありがとうございました。今私はすべてが非常に良いので、どの答えを受け入れるか分からない。 – Jeff

+1

ジャスティンは...おそらく遅すぎる、それはかなりよくなりましたがカバーされていますので、しかし、私の本の中で、paranthesis内側に無名関数を置く理由を忘れないでください:) – Sampson

答えて

13

それはのようなものをやってとfunctionaly同等です:関数がすぐに呼び出されるように

var myFunc = function(){ 
    var b = 3; 
    a += b; 
}; 

myFunc(); 

は、それはそれ(および後続)の周りに括弧を持っています。他の人が言ったように、その概念は匿名関数と呼ばれています。

+3

これは単なる別の方法ではありません。あなたのやり方は、他の既存の変数と衝突するかもしれないし、そうでないかもしれない変数 'myFunc'を作ります。 OPによって転記されたコードはこの変数を作成しません。それはもちろん匿名です。しかし、値は変数にバインドされており、OPコードには存在しません。 – Svend

+2

私は2つがまったく同等であるということを意味しなかった...ちょうどfunctionaly。彼らは最終的に同じ結果を生み出します。 –

5

これは作成直後に起動する匿名関数です。

4

その無名関数です。

無名関数には名前が与えられている必要はありません は、実行時に動的 で宣言されている機能です。

匿名関数は、 関数演算子を使用して宣言されています。 ファンクション演算子を使用すると、 式を入れるのが有効な場合はいつでも、新しい 関数を作成できます。たとえば、 は、関数呼び出しにパラメータ として新しい関数を宣言したり、別のオブジェクトの プロパティを割り当てることができます。さらに読書のために

Javascript anonymous functions

無名関数は、唯一の場所で使用される機能 を宣言するときに、コード をより簡潔にすることができます。 関数を宣言して使用する代わりに、 を1つの手順で実行することができます。イベント を宣言し、メソッドを オブジェクトに割り当てるのに便利なのは、特に です。

たとえば、コンストラクタ関数を作成する場合は、オブジェクトのメソッドを宣言してオブジェクトのプロパティに割り当てて、オブジェクトの外で呼び出せるようにする必要があります。これは、関数を宣言してから、このような、別のステップとして変数に代入することが可能です:

function Pet(name, species, hello) 
{  
      this.name = name;  
      this.species = species;  
      this.hello = hello; 

      function sayHello()  
      {  
       alert(this.hello);  
      } 

      this.sayHello = sayHello;  
     } 

しかし、それは一歩として、それをすべて行うために少しより便利かつ簡潔です:

function Pet2(name, species, hello) 
{ 
     this.name = name;  
     this.species = species;  
     this.hello = hello; 

     this.sayHello = function()  
     {  
      alert(this.hello);  
     }  
    } 
+0

勝例...を提供しました.. – peirix

2

あなたが書いたのは、すぐに呼び出される無名関数です。 その理由は、プライベート変数の使用です。あなたのコードの代わりに:

var b = 3; 
a += b; 

bはグローバル変数になります。したがって、グローバルコードのプライベート変数が必要な場合は、それがこれを行う方法です。

1

これは、その場所で実行される無名関数です。これを最も有効に使用するには、コンテキストや環境の設定を行うか、負荷に何らかの副作用があります。

これは重くロード時間の魔法を実行し、多くのブラウザの癖や欠点を回避するなどのjQuery、道場などのAjaxツールキットで使用されています。

1

それはそれは捨て、その後、直接、作成後に呼び出され、匿名関数です。

これは、構文エラーを防ぐために、括弧内です。かっこがなければ、キーワードfunctionの後に識別子が続く必要があります。

また、変数で関数を置くために、次のように行い、それを呼び出すことができます。functionキーワードが最初でない場合、括弧が必要とされていないことを

var x = function() { 
    var b = 3; 
    a += b; 
} 
x(); 

注意してください。

1

javascriptの関数はオブジェクトであり、オブジェクトとしても使用できます。たとえば、次のようにすることができます。

var a = function() {alert("done");}; 
a(); 

これは、内部でロジックを渡す必要があるさまざまな機能でよく使用されます。例えば、アレイは、「ソート」機能は、機能オブジェクトは配列をソートする方法を決定するために内部に渡されることを期待:

var a = [{id: 15, name: 'test'}, 
     {id: 11, name: 'asd'}, 
     {id: 88, name: 'qweqwe'}]; 
a.sort(function(a,b) { 
    if (a.id > b.id) return 1; //Put a after b 
    if (a.id < b.id) return -1; //Put a before b 
    if (a.id == b.id) return 0; //Don't make no changes 
}); 

「ソート」メソッドは次にソートする配列要素のすべての種類を提供する機能を呼び出しますそれ。

あなたの例では、何 - それは関数オブジェクトを作成し、ちょうどすぐにそれを実行します。

1

ジャスティンの答えはかなりうまく説明されていますが、最初の括弧(functionより前の最初のセット)は、実際にはプログラムの実行に関する限り、完全に不要です。しかし、読みやすくするために、それは非常に重要です!私はこれを見たとき:

(function() { 

私はブロックの終わりを見つけるためにスクロールすることなく、この関数はすぐに呼び出されていることを知って。関数の戻り値を変数に代入したい場合や、関数を変数に代入したい場合があるため、これは重要です。参照:

var x = (function() { 
    return 4; 
})(); 

var y = function() { 
    return 4; 
}; 

// typeof x == integer (4) 
// typeof y == function