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

发布于 2024-12-03 06:12:08 字数 660 浏览 1 评论 0原文

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

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

I wonder, how to get function stack called arguments if function was called as recursive?
If I have a normal functions that each calls another one, it works. But if I'm trying to get
a stack from recursive one, I always get the last passed arguments.

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)

in this case I'll get always the same result:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

自在安然 2024-12-10 06:12:08

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

arguments.callee == the function current called,
the caller of this function always points to the caller function itself,
so in recursive functions your caller won't track back to the top but always point to the same function, e.g.

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)

this will result in 20 times console.log.
Currently I can not find a way to solve this - personally I consider it a mis-design in javascript.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文