了解JavaScript中的递归和替代方法

舒布

list以下代码中的数据很大时,为什么我的浏览器速度变慢

var list = [];

/*
  Creating some huge dummy data
  Interstingly, when I change the value of i from 10000 
  to 100000, the browser hangs(becomes unresponsive)
*/
for(i=0;i<10000;i++){
  list.push(i);

}

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

    if (item) {
        console.log(item);
        // process the list item...
        nextListItem();
    }
};
nextListItem(); // Commented this as browser becomes unresponsive.

jsbin

我无法从Google那里找到我的问题的直接答案,因此尽管获得了SO专家的帮助。我以为它与浏览器内存有关,因为我可以看到循环以很高的速度开始,然后慢慢减慢并变得无响应。但不确定为什么吗?

阿迪特·沙

JavaScript没有尾声消除功能。因此,如果您递归遍历列表,则会浪费大量资源。最终,您甚至可能会耗尽堆栈空间。

解决此问题的一种可能的方法是异步调用tail调用,以便main函数在tail调用函数开始执行之前完成执行。这样可以确保堆栈空间不会增加:

var list = [];

for (var i = 0; i < 10000; i++) list.push(i);

var start = new Date;

nextListItem();

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

    if (item) {
        console.log(item);
        setTimeout(nextListItem, 0);
    } else console.log(new Date - start);
}

有关更多详细信息,请参见以下问题:

延续和回调之间有什么区别?


编辑:更快的解决方案(由TJ Crowder建议):

var list = [];

for (var i = 0; i < 10000; i++) list.push(i);

var start = new Date;

nextListItem();

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

    if (item) {
        console.log(item);
        if (item % 100) nextListItem();
        else setTimeout(nextListItem, 0);
    } else console.log(new Date - start);
}

循环更加缓慢,因为它以100个项目的突发打印到控制台。但是,它可以更快地完成执行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

了解JavaScript中的递归和替代方法

来自分类Dev

了解递归函数中的数组和指针

来自分类Dev

了解 Python 中的递归和堆栈

来自分类Dev

试图了解JavaScript中for循环内的递归

来自分类Dev

试图了解JavaScript中for循环内的递归

来自分类Dev

我不了解JavaScript中的递归

来自分类Dev

了解获取方法替代

来自分类Dev

布尔递归的替代方法

来自分类Dev

布尔递归的替代方法

来自分类Dev

javascript中.attr()的替代方法

来自分类Dev

Javascript中的替代注释方法

来自分类Dev

了解Javascript中的方法链接

来自分类Dev

了解递归函数在javascript中的工作方式

来自分类Dev

了解递归和多次返回

来自分类Dev

了解Prolog列表和递归

来自分类Dev

了解Prolog列表和递归

来自分类Dev

了解Javascript中的本地存储和Cookie

来自分类Dev

了解JavaScript中的堆栈和框架

来自分类Dev

了解我创建的递归方法

来自分类Dev

递归和递归方法

来自分类Dev

了解Scala中的String和map方法

来自分类Dev

了解Prolog中的递归规则

来自分类Dev

了解Haskell中的基本递归

来自分类Dev

了解树遍历中的递归

来自分类Dev

了解Haskell中的基本递归

来自分类Dev

JavaScript中内联脚本的替代方法

来自分类Dev

在锚标记中添加JavaScript的替代方法

来自分类Dev

JavaScript中匿名函数的替代方法

来自分类Dev

JavaScript中if else语句的替代方法