とIIFEの間に違いはありますか
(function foo () {
var var_of_concern;
}());
そして単純な関数
function foo () {
var var_of_concern;
}
foo();
私が気になった注意点は、IIFE または関数のいずれかから何も渡さない場合、IIFE はメモリをより長く維持できるかということでした。
とIIFEの間に違いはありますか
(function foo () {
var var_of_concern;
}());
そして単純な関数
function foo () {
var var_of_concern;
}
foo();
私が気になった注意点は、IIFE または関数のいずれかから何も渡さない場合、IIFE はメモリをより長く維持できるかということでした。
反対ですが、おそらく深刻な問題ではありません。
この 2 つは構文的に同じではありません。2 番目は、関数を宣言し、それをローカル シンボル "foo" にバインドします。その関数は、関数呼び出しの後も残ります。
IIFE 形式は、構文的に単一の式ステートメントです。2 番目の形式には、関数宣言ステートメントと式ステートメント (関数呼び出し) の2 つのステートメントが含まれます。
関数呼び出しがローカル変数宣言を処理する方法は、関数オブジェクトがどのように作成されたかとは関係ありません。例の両方の関数が同じ場合、関数呼び出しでローカル変数にそのスペースを割り当てる方法に違いはありません。
edit — 主な構文function
の違いは次のとおりです。新しいステートメントの先頭にあるキーワードは、関数宣言ステートメントを導入します。その構文形式は、即時呼び出しを提供しません。つまり、これは次のとおりです。
function hello() {
// some code
}(); // <---- ERROR
構文エラーです。
function
キーワードが他のコンテキスト (有効なコンテキスト) に現れる場合、それは関数宣言ではなく、関数のインスタンス化 (または関数定義。仕様を確認する必要があります) 式です。これらはすべて JavaScript の式の一部にすることができます:
5
"hello"
false
(2 + 5)
(function() { alert("Hi!"); })
最後の例には括弧が含まれていることに注意してください。これは、「ああ、関数宣言を見てください!」を「無効にする」ために一般的に行われます。パーサーの振る舞い。その開き括弧は、function
キーワードがステートメントの絶対的な先頭に現れないことを意味するため、それは単なる関数のインスタンス化式です。