gpt4 book ai didi

javascript - JavaScript 中的调用堆栈大小

转载 作者:IT王子 更新时间:2023-10-29 03:07:53 25 4
gpt4 key购买 nike

我想测试大型调用堆栈。具体来说,当调用堆栈长度达到 1000 时,我想要一个控制台警告。这通常意味着我做了一些愚蠢的事情,并可能导致细微的错误。

我可以在 JavaScript 中计算调用堆栈长度吗?

最佳答案

这是一个适用于所有主流浏览器的函数,尽管它在 ECMAScript 5 严格模式下不起作用,因为 arguments.calleecaller 已在严格模式下被删除模式。

function getCallStackSize() {
var count = 0, fn = arguments.callee;
while ( (fn = fn.caller) ) {
count++;
}
return count;
}

例子:

function f() { g(); }       
function g() { h(); }
function h() { alert(getCallStackSize()); }

f(); // Alerts 3

2011 年 11 月 1 日更新

在 ES5 严格模式下,只有 no way to navigate the call stack .剩下的唯一选择就是解析 new Error().stack 返回的字符串,这是非标准的,没有普遍支持并且明显有问题,甚至这个 may not be possible for ever .

2013 年 8 月 13 日更新

此方法还受到以下事实的限制:在单个调用堆栈中多次调用的函数(例如通过递归)会将 getCallStackSize() 抛入无限循环(如所指出的评论中的@Randomblue)。 getCallStackSize() 的改进版本如下:它跟踪之前看到的函数以避免进入无限循环。但是,返回值是遇到重复之前调用堆栈中不同函数对象的数量,而不是完整调用堆栈的真实大小。不幸的是,这是您能做的最好的事情。

var arrayContains = Array.prototype.indexOf ?
function(arr, val) {
return arr.indexOf(val) > -1;
} :
function(arr, val) {
for (var i = 0, len = arr.length; i < len; ++i) {
if (arr[i] === val) {
return true;
}
}
return false;
};

function getCallStackSize() {
var count = 0, fn = arguments.callee, functionsSeen = [fn];

while ( (fn = fn.caller) && !arrayContains(functionsSeen, fn) ) {
functionsSeen.push(fn);
count++;
}

return count;
}

关于javascript - JavaScript 中的调用堆栈大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7462075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com