Arguments.callee - 因子模式

时间:2015-05-19 21:35:44

标签: javascript recursion arguments factorial

假设:

var x = { 
  y: function(n){ 
    console.log(n);
    console.log(n+":"+( n > 0 ? arguments.callee(n-1) + "o" : "all" ));
  } 
}; 
x.y(4)

控制台日志:

4 
3 
2 
1 
0 
0 -> all
1 -> o
2 -> o
3 -> o
4 -> o

console.log的第一部分对我有意义,我们从n = 4开始,用n-1调用函数本身,最终得到4,3,2,1,0。< / p>

然而,

的输出
console.log(n+":"+( n > 0 ? arguments.callee(n-1) + "o" : "all" ));

有点刺激,因为它会将结果返回到“反转”状态。订购。 为什么n的值是执行的第一部分,没有arguments.callee给出的结果与使用arguments.callee在三元运算符中调用它的结果不同? 这是一个纯粹的定义问题还是存在另一个逻辑原因?

The process would be as the following:
(n=4) = ( 4 > 0 ? arguments.callee(3) + "o" : "all" ) = "o"
  (n=3) = ( 3 > 0 ? arguments.callee(2) + "o" : "all" ) = "o"
    (n=2) = ( 2 > 0 ? arguments.callee(1) + "o" : "all" ) = "o"
      (n=1) = ( 1 > 0 ? arguments.callee(1) + "o" : "all" ) = "o"
        (n=0) = ( 0 > 0 ? arguments.callee(1) + "o" : "all" ) = "all"

这不是以ooooall而不是alloooo结束吗?

干杯

2 个答案:

答案 0 :(得分:0)

当您在表达式中间进行递归调用时,该调用必须执行完成。递归调用会发生什么? console.log()的另一次迭代,就是这样。因此,在第一个(对应4)调用完成之前,必须先完成对3210的调用。

此外,没有理由使用arguments.callee。只需给你的匿名函数一个内部名称:

var x = { 
  y: function y(n){ 
    console.log(n);
    console.log(n+":"+( n > 0 ? y(n-1) + "o" : "all" ));
  } 
}; 

假设您不是2008年的时间旅行者,那个y名称只会绑定 该功能。

答案 1 :(得分:0)

不,因为是一个递归函数,所以,当最后一个函数结束时(&#34; all&#34;)那么所有以前的console.log都会以相反的顺序打印(实际上不是相反的顺序,它是&#39; s正确的顺序,因为是一个递归函数),例如,我们有5个步骤,你说:(n = 4,n = 3 ... n = 0):

f4 - &gt; f3 - &gt; f2 - &gt; f1 - &gt; F0

我们看到f4调用f3,f3调用f2 .....并且f1调用f0。好吧,当f0完成时,使用输出&#34; 0&#34;做了console.log。然后,这个函数(f0)返回上一个函数(f1)打印字母&#34; o&#34;然后f1返回f2 ......和同样的方式,直到返回第一个函数f4。

难以解释但很容易理解。我希望我的解释&#34;可能就够了。