JavaScript从递归调用函数获取调用堆栈参数

时间:2011-09-07 11:42:28

标签: javascript recursion stack

我想知道,如果函数被称为递归,如何获取函数堆栈调用参数? 如果我有一个普通的函数,每个函数调用另一个函数,它就可以了。但是如果我想要的话 从递归的堆栈中,我总是得到最后传递的参数。

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);

1 个答案:

答案 0 :(得分:0)

arguments.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中的错误设计。