2015-05-19 31 views
-2

假设:arguments.callee的 - 阶乘模式

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。

然而,

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?

干杯

+1

咦? *“为什么n的值作为执行的第一部分......”*因为...这就是代码的作用。这里真正的问题是什么?注意'console.log(n)'在另一个'console.log'之前。 –

+0

这些?都是为了表达每个问题。谢谢。 – F4b

+0

这个职位还有助于解决这个问题: [尾递归] [1] [1]:http://stackoverflow.com/questions/33923/what-is-tail-recursion – F4b

回答

0

不,因为是递归函数,所以当最后一个函数结束(“all”)时,所有先前的console.log将以相反的顺序打印(实际上不是逆序,它是正确的顺序,因为是递归函数)中,例如,我们有5个步骤,你说:(N = 4,N = 3,...,N = 0):

F4 - > F3 - > F2 - > F1 - > F0

我们看到f4调用f3,f3调用f2 .....和f1调用f0。那么,当f0结束时,输出为“0”和“all”的console.log,则此函数(f0)返回到上一个打印字母“o”的函数(f1),然后f1返回到f2 .. ....以相同的方式直到返回到第一个函数f4。

这很难解释,但容易理解。我希望我的“解释”可能就够了。

0

当您在表达式中的递归呼叫,该呼叫必须执行完毕。递归调用会发生什么?那个console.log()的另一个迭代,就是这样。因此,在第一个(对应于4)呼叫可以完成之前,必须首先完成对3,2,10的呼叫。

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

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

假设你不是从2008年的时间旅行者,那y名称只势必功能。

+0

Bam。疑难杂症。谢谢。 – F4b