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



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

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

最新更新