zoukankan      html  css  js  c++  java
  • js 递归

    我理解的递归就是自己调用自己,也就是函数在调用的时候会形成 call stack 调用堆栈.这些数据是用来函数调用完成后,回复之前的函数环境或者局部变量之类的,一般这个都有大小限制,不可能无限生成函数调用堆栈数据,这就是我们必须要设置一个函数出口的原因,各个浏览器也做了相应的设置.

    关于<<高性能JavaSaript>>一书中有相应的介绍

    JavaScript 引擎所支持的递归数量与 JavaScript 调用栈大小直接相关。只有 Internet Explorer 例外,它的 调用栈与可用系统内存相关,其他浏览器有固定的调用栈限制。大多数现代浏览器的调用栈尺寸比老式浏 览器要大(例如 Safari 2 调用栈尺寸是 100)。图 4-2 显示出主流浏览器的调用栈大小。

    当你使用了太多的递归,超过最大调用栈尺寸时,浏览器会出错并弹出以下信息:

    • Internet Explorer: “Stack overflow at line x”

    • Firefox: “Too much recursion”
    • Safari: “Maximum call stack size exceeded”

    • Opera: “Abort (control stack overflow)”

    Chrome 是唯一不显示调用栈溢出错误的浏览器。

    关于调用栈溢出错误,最令人感兴趣的部分大概是:在某些浏览器中,他们的确是 JavaScript 错误,可 以用一个 try-catch 表达式捕获。异常类型因浏览器而不同。在 Firefox 中,它是一个 InternalError;在 Safari 和 Chrome 中,它是一个 RangeError;在 Internet Explorer 中抛出一个一般性的 Error 类型。(Opera 不抛出 错误;它终止 JavaScript 引擎)。这使得我们能够在 JavaScript 中正确处理这些错误:

    try { recurse();

    } catch (ex){
    alert("Too much recursion!");

    }

    如果不管它,那么这些错误将像其他错误一样冒泡上传(在 Firefox 中,它结束于 Firebug 和错误终端; 在 Safari/Chrome 中它显示在 JavaScript 终端上),只有 Internet Explorer 例外。IE 不会显示一个 JavaScript 错误,但是会弹出一个提示堆栈溢出信息的对话框。

    比如将数组中的数相加

    <script>
        var arr = [1, 2, 3, 4, 5, 6];
        var sum = 0;
        function add(arr) {
            sum += arr[0];
            arr.shift();
            if (arr.length === 0) return;
             add(arr);
        }
    </script>
  • 相关阅读:
    jQuery的标签选择器$('p')、类选择器$('.myClass')、id选择器$('#myId')
    jQuery Validate验证框架与 jQuery ajaxSubmit的联合使用
    23种设计模式(一) 单例模式
    java 常见的几种运行时异常RuntimeException
    Servlet 生命周期、工作原理
    throw与throws的区别
    Apache Shiro java安全框架
    web.xml 中<context-param>与<init-param>的区别与作用
    web.xml 中CharacterEncodingFilter类的学习
    web.xml中的contextConfigLocation在spring中的作用
  • 原文地址:https://www.cnblogs.com/shenjp/p/7565843.html
Copyright © 2011-2022 走看看