这个功能如何运作?

时间:2013-03-30 15:05:40

标签: javascript

我的问题是这个函数是如何工作的,我不理解的是返回部分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

4 个答案:

答案 0 :(得分:6)

yell(n-1)+"a"使用稍低的n值再次调用该函数,并将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");}
};

答案 1 :(得分:2)

yell是一个递归函数。当你用4来调用它时,只要n> 0,它就会以3(4 - 1)调用自身,然后调用自身为2(3 - 1)等。< / p>

以这种方式调用yell的原因是编写代码的人写了一个命名的函数表达式

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

这样做是创建一个名为yell的函数,并将其分配给对象yell上的属性 ninja。属性和函数碰巧具有相同的名称,但没有理由,它可能是:

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

yell(非限定符号)或上面示例中的foo在函数范围内,因为它是函数的名称。

这里值得注意的是,命名函数表达式在IE8及更早版本上不能正常工作(尽管这个特定的例子仍然可以工作);更多:Double take

答案 2 :(得分:1)

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

yell(n - 1)将在"a"连接之前执行。这意味着当它递归(并且n变得更小)时,它最终将返回"hiy",其他"a"与先前的调用一起连接。{/ p>

答案 3 :(得分:1)

它是递归函数,在n == 0之前调用自身,工作正常。