我想知道,如果函数被称为递归,如何获得函数堆栈调用参数?如果我有一个普通的函数,每个函数调用另一个函数,它可以工作。但如果我想要从一个递归堆栈,我总是得到最后传递的参数。
function a(p1, p2) {
b(p1, p2, 3)
}
function b(p1, p2, p3) {
c(p1, p2, p3, 4)
}
function c(p1, p2, p3, p4) {
console.log(arguments.callee.caller.caller);
}
a(1, 2)
在这种情况下,我将得到相同的结果:
var i = 3;
function a(p1, p2) {
var args = Array.prototype.slice.apply(arguments);
args.push(i);
while (--i > 0) {
arguments.callee.apply(arguments.callee, args);
}
if (i === 0) {
console.log(arguments.callee.caller.caller.caller.caller);
}
}
a(1, 2);
参数。Callee ==当前被调用的函数;这个函数的调用者总是指向调用者函数本身,因此,在递归函数中,调用者不会返回到顶部,而总是指向同一个函数,例如
function printBacktrace(fun,stackDepth){
var callee = fun;
while(callee.caller && stackDepth > 0){
console.log(callee.caller.name);
callee = callee.caller ;stackDepth--;
}
}
function f(n){
if(!n){printBacktrace(f,20)}else{f(n-1)}
}
f(3)
这将导致20倍的console.log
。
目前我无法找到解决这个问题的方法-我个人认为这是javascript中的错误设计。