怎样避免JavaScript中过长递归导致的堆栈溢出

JavaScript031

怎样避免JavaScript中过长递归导致的堆栈溢出,第1张

递归最容易导致的问题就是堆栈溢出了,一般来说操作系统给一个进程划分的栈内存是2M(好像是),按照正常的程序处理,局部变量进栈出栈,栈不太可能会溢出,但是递归会导致不会出栈,这就有可能导致堆栈溢出,你这里定义两个int型变量,即8字节,再加上保存的函数地址等信息,*100000次递归,还有一些其他的入栈的局部变量,可能已经超出了最大的栈空间,所以溢出。

解决办法:换一个js包含的方式,让javascript加载速度倍增。

把通常加载方式:

<script src="xxxx.js"></script>

改变成:

<script type="text/javascript">document.write("<scr"+"ipt src=\"xxx.js\"></sc"+"ript>")

</script>

JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。

在1995年时,由Netscape公司的Brendan Eich,在网景导航者浏览器上首次设计实现而成。因为Netscape与Sun合作,Netscape管理层希望它外观看起来像Java,因此取名为JavaScript。但实际上它的语法风格与Self及Scheme较为接近。

为了取得技术优势,微软推出了JScript,CEnvi推出ScriptEase,与JavaScript同样可在浏览器上运行。为了统一规格,因为JavaScript兼容于ECMA标准,因此也称为ECMAScript。

比如楼下说的方法,可以设置JS变量来,或者再标签上加自己定义属性,示例如下:

<input type="button" value="测试" state="0" id="btn" />

<script type="text/javascript">

    // JS的做法, 当然下面的也可以把点击时间做成函数,然后添加到空间上面

    document.getElementById("btn").onclick = function() {

        //获取按钮点击状态

        var s = this.getAttribute("state")

        if(s == '1') {

            alert("系统处理中,请不要重复点击!")

        } else {

            // 设置点击状态,执行业务逻辑,设置处理中

            this.setAttribute("state", "1")

        }

        // 下方写你的其他代码

        

        this.setAttribute("state", "0") // 设置点击状态,执行完成清空点击

    }

    // jQuery的做法

    $("#btn").click(function() {

        //获取按钮点击状态

        var s = $(this).attr("state")

        if(s == '1') {

            alert("系统处理中,请不要重复点击!")

        } else {

            // 设置点击状态,执行业务逻辑,设置处理中

            $(this).attr("state", "1")

        }

        // 下方写你的其他代码

        

        $(this).attr("state", "0") // 设置点击状态,执行完成清空点击

    })

</script>