【问题标题】:JavaScript get call stack arguments from recusrive called functionJavaScript 从 recursive 调用函数获取调用堆栈参数
【发布时间】:2011-11-12 02:13:39
【问题描述】:

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

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

【问题讨论】:

    标签: javascript recursion stack


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      • 2022-11-22
      • 2019-11-22
      • 2011-03-23
      • 2014-11-13
      相关资源
      最近更新 更多