我想知道,如果函数被称为递归,如何获取函数堆栈调用参数? 如果我有一个普通的函数,每个函数调用另一个函数,它就可以了。但是如果我想要的话 从递归的堆栈中,我总是得到最后传递的参数。
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);
答案 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中的错误设计。