[解決済み] なぜ名前付き関数式を使うのか?
質問
JavaScriptの関数表現には、2種類の方法があります。
名前付き関数式(NFE) :
var boo = function boo () {
alert(1);
};
匿名関数式 :
var boo = function () {
alert(1);
};
そして、どちらも呼び出すことができるのは
boo();
. なぜ、いつ無名関数を使い、いつ名前付き関数表現を使うのかがよくわかりません。両者の間にどんな違いがあるのでしょうか?
どのように解決するのですか?
無名関数式の場合、その関数は 匿名 - であり、文字通り、名前を持ちません。代入先の変数には名前がありますが、関数にはありません。 (更新: ES5まではそうでした。ES2015 [別名ES6]では、しばしば無名式で作成された関数は真の名前[ただし自動識別子ではない]を取得します、お読みください...)
名前は便利です。名前は、スタックトレース、コールスタック、ブレークポイントのリストなどで見ることができます。名前は良いものです(Names are a Good Thing™)。
(IE の古いバージョン [IE8 以下] では、名前付き関数式に注意する必要がありました。2 つの完全に異なる関数オブジェクトを 2 つの完全に異なる時間に誤って作成してしまうためです。 ダブルテイク ]. IE8 [!] をサポートする必要がある場合は、無名関数式や関数 宣言 を使うのがベストでしょう。ただし、名前付きの関数式は避けてください)。
名前付き関数式の重要な点は、関数本体の中にその名前を持つインスコープ識別子を作成することです。
var x = function example() {
console.log(typeof example); // "function"
};
x();
console.log(typeof example); // "undefined"
ES2015 では、多くの "anonymous" 関数式が名前を持つ関数を作成しますが、これは、さまざまな最新の 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() { /*...*/ }
});
(最後の二つは本当に同じものです)
の場合、結果として得られる関数は名前(
boo
という名前になります。)
重要な、そして意図的な、例外があります。既存のオブジェクトのプロパティに割り当てることです。
obj.boo = function() { /*...*/ }; // <== Does not get a name
これは、新しい機能が追加される過程で情報漏洩の懸念が生じたためです。詳細は別の質問に対する私の回答で説明しています。 はこちら .
関連
-
[解決済み】event.stopPropagationとevent.preventDefaultの違いは何ですか?
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み] event.preventDefault() vs. return false
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] varキーワードの目的と、どのような場合に使用する(または省略する)べきですか?
-
[解決済み】JavaScriptの関数にデフォルトのパラメータ値を設定する
-
[解決済み] React js 親コンポーネントから子コンポーネントの状態を変更する
-
[解決済み] オブジェクトの配列からReactコンポーネントをレンダリングする
-
[解決済み] Node.jsのES6クラスをrequireで作る
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JavaScriptで次の要素/前の要素を取得しますか?
-
[解決済み] なぜ "use strict "はパフォーマンスを10倍向上させるのか?
-
[解決済み] JSXとLoadshを使用して、ある要素をn回繰り返す方法
-
[解決済み] ECMAScriptとは?
-
[解決済み] Javascript の parseInt() で先頭のゼロを削除する。
-
[解決済み] JavaScript で `throw` の後に `return` をする必要がありますか?
-
[解決済み] HTML要素にスクロールバーがあるかどうかをチェックする
-
[解決済み] javascriptのキャンバスで画像をリサイズする (スムーズ)
-
[解決済み] V8 Javascript エンジンのスタンドアロン実行
-
[解決済み] JavaScriptの文字列プリミティブとStringオブジェクトの違いは何ですか?