0

私の質問は、この関数がどのように機能するかyell(n-1) + "a"です. 方法がわかりません。3ahiyaaaa

機能コード

var ninja = { 
  yell: function yell(n){ 
    return n > 0 ? yell(n-1) + "a" : "hiy"; 
  } 
};
ninja.yell(4); //returns hiyaaaa
4

4 に答える 4

6

yell(n-1)+"a"のわずかに低い値で関数を再度呼び出し、再帰呼び出しが返すものにnan を付けます。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");}
};
于 2013-03-30T15:12:04.047 に答える
2

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に割り当てます。プロパティと関数はたまたま同じ名前を持っていますが、そうしなければならない理由はありません。 yellninja

yell: function foo(n){ 
  return n > 0 ? foo(n-1) + "a" : "hiy"; 
} 

yell(非修飾記号)、またはfoo上記の例では、関数の名前であるため、関数内のスコープにあります。

ここで、名前付き関数式が IE8 以前では正しく機能しないことに注意してください (ただし、その特定の例は引き続き機能します)。more:ダブルテイク

于 2013-03-30T15:11:38.657 に答える
1
return n > 0 ? yell(n - 1) + "a" : "hiy"; 

yell(n - 1)と連結するに実行され"a"ます。つまり、再帰する (そしてn小さくなる) と、最終的には、以前の呼び出しから連結され"hiy"た他の s とともに返されます。"a"

于 2013-03-30T15:11:13.997 に答える
1

これは再帰関数であり、n==0 になるまで自分自身を呼び出し、問題なく動作します。

于 2013-03-30T15:11:19.680 に答える