John ResigのLearning Advanced Javascriptを読むと、完全に理解できない2つのスライドが出てきました。匿名と名前の付いた関数を参照するプロパティ
スライド#13 - 無名関数であるプロパティを参照します。 2番目のアサートは失敗します。
var ninja = {
yell: function(n){
return n > 0 ? ninja.yell(n-1) + "a" : "hiy";
}
};
assert(ninja.yell(4) == "hiyaaaa", "A single object isn't too bad, either."); // PASS
var samurai = { yell: ninja.yell };
var ninja = null;
try {
samurai.yell(4);
} catch(e){
assert(false, "Uh, this isn't good! Where'd ninja.yell go?"); // FAIL
}
スライド#14 - 定義された機能であるプロパティを参照します。第二の主張は合格する。
var ninja = {
yell: function yell(n){
return n > 0 ? yell(n-1) + "a" : "hiy";
}
};
assert(ninja.yell(4) == "hiyaaaa", "Works as we would expect it to!"); // PASS
var samurai = { yell: ninja.yell };
var ninja = {};
assert(samurai.yell(4) == "hiyaaaa", "The method correctly calls itself."); // PASS
ここでの唯一の違いは、名前付き関数として定義されたプロパティへの参照も新しいオブジェクトに元のオブジェクト(ninja
)を設定した後に残るんなぜyell
がスライド14内の名前付き関数であること(または偶数ヌル)?
@Weedoze - いいえ関数の宣言が呼び出されます。関数式はそうではありません。関数の宣言*には名前を付ける必要があります。関数式**には**名前を付けることができます。この質問は、名前付き関数式と無名関数式の違いについてです。関数の宣言は必要ありません。 – Quentin