假设:
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结束吗?
干杯
答案 0 :(得分:0)
当您在表达式中间进行递归调用时,该调用必须执行完成。递归调用会发生什么? console.log()
的另一次迭代,就是这样。因此,在第一个(对应4
)调用完成之前,必须先完成对3
,2
,1
和0
的调用。
此外,没有理由使用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;可能就够了。