無名関数式の場合、関数は匿名です —文字通り、名前はありません。割り当てる変数には名前がありますが、関数にはありません。(更新:ES5でそれは真実でした。ES2015[別名ES6]以降、匿名式で作成された関数は、真の名前を取得しますが、自動識別子ではありません)。
名前は便利です。名前は、スタックトレース、コールスタック、ブレークポイントのリストなどで確認できます。名前はGood Thing™です。
彼らは誤って[私のブログの記事により2つの完全に異なる時間に2つの完全に独立した関数オブジェクトを作成したので、(あなたは、[以下IE8と] IEの古いバージョンで指定された関数式に注意する必要があるために使用されるダブルテイク ]。あなたが必要な場合IE8 [!!]をサポートします。無名の関数式または関数宣言を使用することをお勧めしますが、名前付き関数式は使用しないでください。)
名前付き関数式の重要な点の1つは、関数の本体内に関数のその名前を持つスコープ内識別子を作成することです。
var x = function example() {
console.log(typeof example); // "function"
};
x();
console.log(typeof example); // "undefined"
ただし、ES2015の時点では、多くの「匿名の」関数式が名前付きの関数を作成します。これは、コンテキストから名前を推測することについて非常に賢いさまざまな最新のJavaScriptエンジンによって先行されていました。ES2015では、無名関数式の結果はという名前の関数になりますboo
。ただし、ES2015 +のセマンティクスを使用しても、自動識別子は作成されません。
var obj = {
x: function() {
console.log(typeof x); // "undefined"
console.log(obj.x.name); // "x"
},
y: function y() {
console.log(typeof y); // "function"
console.log(obj.y.name); // "y"
}
};
obj.x();
obj.y();
関数名の割り当ては、仕様のさまざまな操作で使用されるSetFunctionName抽象操作で行われます。
短いバージョンは、基本的に、次のように、割り当てや初期化などの右側に匿名関数式が表示される場合です。
var boo = function() { /*...*/ };
(またはそれであるかもしれないlet
またはそれconst
よりむしろvar
))、または
var obj = {
boo: function() { /*...*/ }
};
または
doSomething({
boo: function() { /*...*/ }
});
(最後の2つは実際には同じものです)、結果の関数には名前(boo
例では)が付けられます。
重要かつ意図的な例外があります。既存のオブジェクトのプロパティに割り当てるには:
obj.boo = function() { /*...*/ }; // <== Does not get a name
これは、新機能が追加される過程で情報漏えいの懸念が生じたためです。詳細はこちらの別の質問に対する私の回答で。