2 つの表記法は機能的に同等です。
次のことが想定できます。
function a() {}
function b() {}
次のように解釈されます。
var a, b;
a = function a() {};
b = function b() {};
これが、使用前に宣言する必要がない (定義しない!) 理由です。変数の場合と同じように、定義後に関数を再割り当てできます。関数は変数であるため、変数と同じように巻き上げられます(マインド = 吹き飛ばされた? 良い!)。
使用前申告
function a() { b(); } // using b before it's declared?
function b() {}
になります:
var a, b;
a = function a() { b(); }; // nope! b is declared, we're good
b = function b() {};
関数の再定義
function a() { alert("a"); }
a = function b() { alert("b"); }; // that's weird!
になります:
var a;
a = function a() { alert("a"); };
a = function b() { alert("b"); }; // oh, that looks normal
宣言と定義
宣言する: var x
. 英語では「I will be using variable x
」 .
定義: x = 5
. 英語で「変数x
は値を持つようになりました5
」 .
では使用前宣言が必須であり、強制されてい"use strict"
ます。使用前定義は不要です。実行時に変数が定義されていれば問題ありません。
宣言var x = 5
と定義の両方もfunction a() {}
同様です。
関数に名前を付けるときは、既存の変数をオーバーライドしないように注意してください。
var a = function () { alert("a"); };
var b = function a() { alert("b"); };
a(); // prints "b"
Lintツールはこれに対応します。
どの表記をいつ使用するか?
後でvar a = function () {}
の値を再割り当てする場合にのみ、関数式表記 ( ) を使用することをお勧めします。a
次に、関数式は、a
再割り当てされる予定であり、それが意図的であることをリーダーに通知します。
関数式表記のもう 1 つの (小さな) 引数は、JSLint のような Lint ツールです。関数を使用する前に、関数を宣言する (定義するのではなく!) 必要がある場合があります。再帰的な定義を持つ関数がある場合、つまり. a
callsb
とb
callsa
の場合、関数宣言表記を使用して一方を他方の前に宣言することはできません。
編集メモ:名前付き無名関数について少し修正しました。スタックトレースを見ているときに匿名関数に名前を付けると便利です。名前付き関数は、「匿名」としてログに記録されないように、より多くのコンテキストを提供します。