次のコード行の違いは何ですか?
//Function declaration
function foo() { return 5; }
//Anonymous function expression
var foo = function() { return 5; }
//Named function expression
var foo = function foo() { return 5; }
質問:
- 名前付き/匿名関数式とは何ですか?
- 宣言された関数とは何ですか?
- ブラウザはこれらの構成要素をどのように異なって処理するのでしょうか?
同様の質問に対する回答(var functionName = function() {} と function functionName() {}) 正確に理解できないのですか?
ベストアンサー1
これらは実際には非常によく似ています。呼び出す方法はまったく同じです。違いは、ブラウザがそれらを実行コンテキストに読み込む方法にあります。
関数宣言は、コードが実行される前に読み込まれます。
関数式は、インタープリターがそのコード行に到達したときにのみ読み込まれます。
したがって、関数式がロードされる前に呼び出そうとすると、エラーが発生します。代わりに関数宣言を呼び出すと、すべての宣言がロードされるまでコードを呼び出すことができないため、常に機能します。
例: 関数式
alert(foo()); // ERROR! foo wasn't loaded yet
var foo = function() { return 5; }
例: 関数宣言
alert(foo()); // Alerts 5. Declarations are loaded before any code can run.
function foo() { return 5; }
質問の2番目の部分について:
var foo = function foo() { return 5; }
実際には他の 2 つと同じです。このコード行は以前は Safari でエラーを引き起こしていましたが、現在はエラーは発生しません。