4

とIIFEの間に違いはありますか

(function foo () {
    var var_of_concern;
}());

そして単純な関数

function foo () {
   var var_of_concern;
}
foo();

私が気になった注意点は、IIFE または関数のいずれかから何も渡さない場合、IIFE はメモリをより長く維持できるかということでした。

4

1 に答える 1

6

反対ですが、おそらく深刻な問題ではありません。

この 2 つは構文的に同じではありません。2 番目は、関数を宣言し、それをローカル シンボル "foo" にバインドします。その関数は、関数呼び出しの後も残ります。

IIFE 形式は、構文的に単一の式ステートメントです。2 番目の形式には、関数宣言ステートメントと式ステートメント (関数呼び出し) の2 つのステートメントが含まれます。

関数呼び出しがローカル変数宣言を処理する方法は、関数オブジェクトがどのように作成されたかとは関係ありません。例の両方の関数が同じ場合、関数呼び出しでローカル変数にそのスペースを割り当てる方法に違いはありません。

edit — 主な構文functionの違いは次のとおりです。新しいステートメントの先頭にあるキーワードは、関数宣言ステートメントを導入します。その構文形式は、即時呼び出しを提供しません。つまり、これは次のとおりです。

function hello() {
  // some code
}();  // <---- ERROR

構文エラーです。

functionキーワードが他のコンテキスト (有効なコンテキスト) に現れる場合、それは関数宣言ではなく、関数のインスタンス化 (または関数定義。仕様を確認する必要があります) 式です。これらはすべて JavaScript の式の一部にすることができます:

 5
 "hello"
 false
 (2 + 5)
 (function() { alert("Hi!"); })

最後の例には括弧が含まれていることに注意してください。これは、「ああ、関数宣言を見てください!」を「無効にする」ために一般的に行われます。パーサーの振る舞い。その開き括弧は、functionキーワードがステートメントの絶対的な先頭に現れないことを意味するため、それは単なる関数のインスタンス化式です。

于 2013-03-28T17:33:13.797 に答える