私の質問は、この関数がどのように機能するかyell(n-1) + "a"
です. 方法がわかりません。3a
hiyaaaa
機能コード
var ninja = {
yell: function yell(n){
return n > 0 ? yell(n-1) + "a" : "hiy";
}
};
ninja.yell(4); //returns hiyaaaa
私の質問は、この関数がどのように機能するかyell(n-1) + "a"
です. 方法がわかりません。3a
hiyaaaa
var ninja = {
yell: function yell(n){
return n > 0 ? yell(n-1) + "a" : "hiy";
}
};
ninja.yell(4); //returns hiyaaaa
yell(n-1)+"a"
のわずかに低い値で関数を再度呼び出し、再帰呼び出しが返すものにn
an を付けます。a
この場合、次のチェーンが得られます。
ninja.yell(4)
yell(3)+"a"
(yell(2)+"a")+"a"
((yell(1)+"a")+"a")+"a"
(((yell(0)+"a")+"a")+"a")+"a"
((("hiy"+"a")+"a")+"a")+"a"
"hiyaaaa"
ただし、個人的には関数を次のように書き直します。
ninja = {
yell: function(n) {return "hiy"+new Array(n+1).join("a");}
};
yell
再帰関数です。4 で呼び出すと、3 (4 - 1) で自分自身を呼び出し、次に 2 (3 - 1) で自分自身を呼び出しn
ます> 0
。
この方法で呼び出すことができる理由yell
は、コードを書いている人が名前付きの関数式を書いたからです:
yell: function yell(n){
return n > 0 ? yell(n-1) + "a" : "hiy";
}
これは、 という名前の関数を作成し、それをobjectのプロパティyell
に割り当てます。プロパティと関数はたまたま同じ名前を持っていますが、そうしなければならない理由はありません。 yell
ninja
yell: function foo(n){
return n > 0 ? foo(n-1) + "a" : "hiy";
}
yell
(非修飾記号)、またはfoo
上記の例では、関数の名前であるため、関数内のスコープにあります。
ここで、名前付き関数式が IE8 以前では正しく機能しないことに注意してください (ただし、その特定の例は引き続き機能します)。more:ダブルテイク
return n > 0 ? yell(n - 1) + "a" : "hiy";
yell(n - 1)
と連結する前に実行され"a"
ます。つまり、再帰する (そしてn
小さくなる) と、最終的には、以前の呼び出しから連結され"hiy"
た他の s とともに返されます。"a"
これは再帰関数であり、n==0 になるまで自分自身を呼び出し、問題なく動作します。