JavaScript - 来自John Resig学习高级JavaScript的示例#10

时间:2011-03-17 00:41:11

标签: javascript

m reading John Resig s“学习高级JavaScript”http://ejohn.org/apps/learn/#10并且遇到了我不明白的这个功能。

使用参数4调用函数yell。完成此操作后,参数4将通过三元运算符运行。如果它大于零,那么我们来yell(n-1) + a 我的问题与此有关。

a)yell(n-1) + a使用参数3再次调用该函数(即重新启动它)。

b)如果你做(n-1) + a,,你会得到3a的结果。 JavaScript将3a转换为“aaa”。我问这个是因为在断言行中它显示yell(4) == "hiyaaaa"

c)转换后,是否以某种方式将其添加到“hiy”?我不明白怎么做。

d)如果JavaScript确实将3a转换为“aaa”的字符串,并以某种方式设法将其添加到“hiy”,我不明白为什么叫喊(4)= hiyaaaa。大喊(n-1)+ a = hiyaaa(3as),而不是hiyaaaa(4“a”s)。

你可以看到我完全糊涂了。

function yell(n){
  return n > 0 ? yell(n-1) + "a" : "hiy";
}
assert( yell(4) == "hiyaaaa", "Calling the function by itself comes naturally." );

4 个答案:

答案 0 :(得分:1)

a)是的,它再次调用该函数,因此该函数是递归的。

b)如果其中一个操作数是字符串,+会进行字符串连接。

c)它返回它。

d)将递归写在纸上,以便更好地将其显示出来。

答案 1 :(得分:1)

对于a),它被称为递归函数,是的,它用3调用self。

对于b)你不只是做(n-1),你正在做大喊(n-1)+“a”,一旦n = 0,yell(0)返回0。

对于c),读取b)的最后一部分,即由于三元语句,一旦n = 0,它将返回“hiy”。

对于d),请参阅其余部分。

答案 2 :(得分:1)

a)这个函数正在利用递归,所以是的,再次调用该函数,其他所有内容都被推送到堆栈上等待返回值。 b)否,如上所述,使用返回值调用该函数。 c)见上文。 d)没有。

这样想:

function a(val) {
  return val + "a";
}

function b(val) {
  return a(val) + "a";
}

如果你打电话给b(“hiya”),你会得到hiyaaa。现在,不要调用不同的函数,而是调用相同的函数。

答案 3 :(得分:0)

尝试用提供给yell函数的参数替换“a”。像这样:

function yell(n){  return n > 0 ? yell(n-1) + n : "hiy"; }
var x = yell(4); log(x);
assert( yell(4) == "hiy1234", "Calling the function by itself comes naturally." );

因此,n的每个值都被取为LIFO堆栈,即4,3,2,1,当n成为0 "hiy"时,它位于LIFO堆栈的顶部。然后连接将从堆栈中弹出每个值,使得字符串变为"hiy1234"

希望这有帮助。

Bumpfster