3

次のように JavaScript で無名関数を作成すると、次のようになります。

(function(){
/* some code here */
})()

この関数はどのオブジェクトに追加され、この関数はどこに存在しますか?

また、jQuery ソース コードには、次のような無名関数が含まれています。

(function(window, undefined){
    /* some code here */
    })(window)

この関数の引数は、匿名の引数なしの関数とどのように区別されますか?

4

3 に答える 3

4

JavaScript の関数はです。つまり、関数はオブジェクトによって表され、他のオブジェクトと同様に、変数の値になったり、式に参加したりできます。

したがって

(function() { ... })

値です。17または"hello world"値です。

関数が (値として) 式に表示され、その後(...)に括弧内にコンマ区切りの式のリストが続く場合、それは関数呼び出しです。

では、次のようにします。

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

関数を (値として) 作成し、その関数を引数なしで呼び出します。関数オブジェクトは、少なくともそのコードの直接の結果として、どこにも保存されません。関数呼び出しが完了すると本質的に消え、その部分式の全体的な値は関数が返したものになります。

このような関数にパラメーターを渡すことは、他の関数にパラメーターを渡すことと同じです。あなたが引用した特定の例では、目的は、誤った「エイリアン」コードによって引き起こされる特定の種類の異常を防ぐことです。あなたの例は本当に読むべきです:

(function(window, undefined) {
  // code
})(this);

シンボルthisは予約語であり、その値はランタイムによって完全に制御されます。(まあ、ローカル実行コンテキストの値はこのように制御されます。) グローバル スコープで評価されると、上記のコードは無名関数でシンボル "window" がグローバル コンテキストへの参照になることを保証します。この種の構造は、グローバル コンテキストが「ウィンドウ」と呼ばれない Node.js など、ブラウザ以外のコンテキストで使用される可能性のあるコードにも役立ちます。

于 2013-04-01T17:14:36.477 に答える
1

ウィキペディアの定義の最初の行によると、あなたが示した両方の例は無名関数です。

無名関数 [...] は、識別子にバインドされずに定義され、場合によっては呼び出される関数 (またはサブルーチン) です。

匿名性に関しては、引数に違いはありません。匿名関数は、非匿名関数 (つまり、名前付き関数) と同様に、0、1、2、... n 個の引数を取ることができます。

無名関数の主な利点の 1 つは、どこにでも存在する必要がないことです。他の型の他の値と同様に、インラインで定義して使用できます。

于 2013-04-01T17:19:11.440 に答える
0

@Pointyの回答に追加して、匿名関数にパラメーターを追加しても違いはありません

(function(){
  /* some code here */
})()

(function(window,undefined){
  /* some code here */
})(window)

両方の関数は呼び出された後に失われます。唯一の違いは、2 番目の関数内でいくつかの変数または関数がウィンドウ コンテキストに格納されていることですが、無名関数自体は呼び出し後に失われます。

関数への参照を保持する必要がある場合は、試してください

(window.myFunc = function(arg1, arg2, arg3) {
   /* your code here*/
})(arg1, arg2, arg3)
于 2013-04-01T17:20:44.500 に答える