使用setTimeout函数解决栈溢出问题

下面的代码,如果队列太长会导致栈溢出,怎样解决这个问题并且依然保持循环部分:

var list = readHugeList();
var nextListItem = function() {
    var item = list.pop();
    if (item) {
        // process the list item...
        nextListItem();
    }
};

通过修改nextListItem功能可以避免潜在的堆栈溢出,如下所示:

var list = readHugeList();

var nextListItem = function() {
    var item = list.pop();

    if (item) {
        // process the list item...
        setTimeout( nextListItem, 0);
    }
};

栈溢出主要是因为循环事件,而不是栈。当执行nextListItem时,如果item不是null,在settimeout函数中的nextListItem会推入到事件队列中。当事件空闲,则会执行nextListItem,因此,这种方法从开始到结束没有直接进行循环调用,可以不用考虑循环次数。

时间: 2024-10-31 01:11:46

使用setTimeout函数解决栈溢出问题的相关文章

JS中的setTimeout()函数

1.setTimeout() 方法 setTimeout() 方法用于在指定的毫秒数后调用函数或执行表达式.返回一个 ID(数字),可以将这个ID传递给 clearTimeout() 来取消执行. setTimeout(code, milliseconds, param1, param2, ...) setTimeout(function, milliseconds, param1, param2, ...) //code|function:必需.要调用一个代码串,也可以是一个函数. 第三个及之

TIMESAMPE_HEX_TO_CHAR函数 解决时间16进制可视化问题

  在11G 提供了一个超过4秒的SQL视图 里面包含了很多必要的信息 同时可以使用 --查看超过4秒语句执行计划SELECT dbms_sqltune.report_sql_monitor(sql_id => '&sql_id',report_level => 'ALL',type=>'TEXT') comm FROM dual; 获得个格式美化的东西 可是其中 Binds=====================================================

setTimeout函数在浏览器中和Node.js中的区别

setTimeout函数delay时间之后执行一次func. setTimeout函数原型: var timeoutID = window.setTimeout(func, [delay, param1, param2, ...]); var timeoutID = window.setTimeout(code, [delay]);//not recommended for the same reasons as using eval() //param1, param2, and so for

js setTimeout函数

最近在看JS DOM编程艺术,在第十章的动画里面有个setTimeout函数的例子中涉及了很多的引号,研究了好大一会才看明白,综合网上各个大神的解释和自己的理解,其原理是这样的: 首先看下程序源代码: 1 function moveElement(elementID,final_X,final_Y,interval){ 2 if(!document.getElementById) return false; 3 if(!document.getElementById(elementID)) re

什么是setTimeout函数和setInterval函数?

我们一般在浏览网页的时候,一般都会有图片轮播等,一些比较好玩的特效,接下来我就给大家讲讲这俩个函数! 一setTimeout函数和setInterval函数的语法以及应用 1.setTimeout函数 定义和用法:setTimeout()方法用于在指定的毫秒数后调用函数或计算表达式. 语法:setTimeout(code,millisec); 参数: code (必需):要调用的函数后要执行的 JavaScript 代码串. millisec(必需):在执行代码前需等待的毫秒数. 提示: set

JavaScript 分支函数 (解决兼容问题更好的方法)

#非常实用的方法,推荐使用# 分支函数的作用是:可以解决兼容问题 if 或者 else 的重复判断的问题,我们一般的做法是:根据兼容的不同写 if,else 等,这些判断来实现兼容,但是这样明显就有一个缺点,每次执行这个函数的时候,都需要进行 if 和 else 的检测,效率明显不高,我们现在使用分支函数来实现当初始化的时候进行一些检测,在之后的运行代码过程中,代码就无需检测了: // 我们先来看看传统的封装ajax请求的函数 //创建XMLHttpRequest对象: var xmlhttp;

php的ord函数——解决中文字符截断问题

php的ord函数——解决中文字符截断问题 分类: PHP2014-11-26 12:11 1033人阅读 评论(0) 收藏 举报 utf8字符截取 函数是这样定义的: int ord ( string$string) 返回字符串 string 第一个字符的 ASCII 码值. 该函数是chr()的互补函数. 试一下: echo ord('我');这里只能返回230, 我是以u8保存的文件并输出的, 它得到的只有230, 而230转换成hex是e6,实际上utf-8中我的编码是e68891, 它

设置c++程序的堆栈空间解决栈溢出问题

设置c++程序的堆栈空间解决栈溢出问题 程序的静态数据量大的时候,有时候会出现栈溢出问题,往往是程序还没运行算法呢,就down掉了,比如你在创建包含大数组的类(或数据)的时候,栈就溢出了.这是由于系统分配给程序的栈空间太小. 一种方法,就是不要静态分配,用new动态创建,是从堆中分配的,堆的空间足够大,不过记得写析构函数,delete你申请的堆空间.其实这样也挺方便,类结束的时候会自动调用析构函数释放空间.养成"不在栈上定义大数组/大对象"的好习惯很重要,否则再大的栈也会被撑爆的. 当

js 设置一个按周期向服务器发送请求 推荐是用 setTimeOut函数

//执行setTimeOut函数返回的ID var timeOutCount; //周期(以毫秒/ms为单位),平均每3秒刷新一次 var timeCycle = 3000; $(function () { getData(); }); //向服务器发送请求,并获取返回结果 function getData() { $.ajax({ type: 'GET', url: '...', dataType: "json", global: false, success: function (