gpt4 book ai didi

javascript - 如何增加 Javascript 中的最大调用堆栈?

转载 作者:可可西里 更新时间:2023-11-01 02:38:57 24 4
gpt4 key购买 nike

我有一个事件,它可以自行触发。我尝试使代码尽可能高效,但在某些情况下它可能会达到最大调用堆栈,这是我无法控制的。它不是一个无限堆栈,它会在某个时候结束,但有时它可能会因为限制而在完成之前崩溃。

如果我设置2个类似的事件监听器并拆分代码,我会增加调用堆栈的数量吗?或者我能做什么?

UPDATE:它是在 DOM 更改事件上(仅与 Webkit 一起工作,所以不要关心其他浏览器),它也可以根据某些条件修改 DOM。我还没有真正达到那个极限,但从理论上讲,它有可能达到。我仍在优化代码以尽可能减少 DOM 操作。

更新 2:我包括示例(非真实)示例:

document.addEventListener('DOMSubtreeModified', function(event){

this.applyPolicy(event);

}, true);

function applyPolicy(event){
if( typeof event != "undefined" ){
event.stopPropagation();
event.stopImmediatePropagation();
}

if( !isButtonAllowed ){
$('button:not(:disabled)').each(function(){

$(this).attr('disabled', true);

});
}
}

这只是一个示例代码,但即使在这种情况下,如果您有 100 个按钮,调用堆栈也会有 100 个。请注意,如果您使用 $('button').attr('disabled', true);,这将导致调用堆栈问题,因为 jQuery 将尝试无限修改 DOM。

最佳答案

虽然听起来您可能需要重新考虑一些代码,但一种可能性是在某个给定的时间间隔内在 setTimeout 中进行递归调用。这允许您开始一个新的调用堆栈。

举个例子...

var i = 0;

function start() {
++i;
var is_thousand = !(i % 1000);

if (is_thousand)
console.log(i);

if (i >= 100000)
return; // safety halt at 100,000
else
start()
}

它只是每隔 1,000 记录一次控制台。在 Chrome 中,它超出了 30,000 范围内某处的堆栈。

演示: http://jsfiddle.net/X44rk/


但是如果你这样重做...

var i = 0;

function start() {
++i;
var is_thousand = !(i % 1000);

if (is_thousand)
console.log(i);

if (i >= 100000) // safety halt at 100,000
return;
else if (is_thousand)
setTimeout(start, 0);
else
start();
}

现在每 1,000,函数将被允许返回,下一次调用将异步进行,开始一个新的调用堆栈。

请注意,这假设在进行递归调用时函数已有效结束。

另请注意,我有一个停止在 100,000 的条件,因此我们不是无限的。

演示: http://jsfiddle.net/X44rk/1/

关于javascript - 如何增加 Javascript 中的最大调用堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9828250/

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