新聞中心
javascript在使用textinput時(shí)出現(xiàn)堆棧溢出
你在事件響應(yīng)時(shí)改變文本框的值,會(huì)導(dǎo)致再次觸發(fā)textinput事件,然后就死循環(huán)了,當(dāng)然棧就溢出了。而keyup事件不會(huì)受影響
我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、浮山ssl等。為上千多家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的浮山網(wǎng)站制作公司
javascript 為什么這樣會(huì)無(wú)限遞歸自己,從而造成死循環(huán)并且溢出?
我先來(lái)解釋無(wú)限遞歸
先舉一個(gè)生活中的例子,就是那個(gè)經(jīng)典的《老和尚給小和尚講故事》的故事:
從前有座山,山里有個(gè)廟,廟里有個(gè)老和尚給小和尚講故事。
講的是什么故事呢?
講的是:
從前有座山,山里有個(gè)廟……
這就是無(wú)限遞歸了。
再來(lái)說(shuō)一下你的程序發(fā)生無(wú)限遞歸的原因:
ajQuery?是一個(gè)函數(shù)。執(zhí)行這個(gè)函數(shù)時(shí),函數(shù)中的?return?語(yǔ)句會(huì)返回一個(gè)值。
它會(huì)返回什么值呢?
返回值是執(zhí)行一個(gè)新的?ajQuery?函數(shù)的返回值,
那么這個(gè)新的?ajQuery?函數(shù)會(huì)返回什么值呢?
這個(gè)新的?ajQuery?函數(shù)會(huì)返回又一個(gè)新的?ajQuery?函數(shù)的返回值,
……
這是無(wú)限遞歸,也是一種死循環(huán)。
最后說(shuō)一下發(fā)生溢出的原因:
每次執(zhí)行?ajQuery?函數(shù),
都會(huì)在結(jié)束前執(zhí)行又一個(gè)新的?ajQuery?函數(shù),
并等待它結(jié)束,然后自身才能結(jié)束。
每執(zhí)行一個(gè)函數(shù)都要占用一些資源,只有函數(shù)結(jié)束后才有可能釋放這些資源。
可是,在無(wú)限遞歸過(guò)程中,不斷地執(zhí)行一個(gè)又一個(gè)函數(shù),卻從不結(jié)束這些函數(shù)。
所以,占用的資源就會(huì)越來(lái)越多。
直到占用的資源超出了允許的范圍,就溢出了!
JavaScript 左移位溢出問(wèn)題:255
JS 左移結(jié)果是一個(gè)有符號(hào)的32位整數(shù),255本身占了8位,左移24位就溢出了
可以參考這個(gè):
javaScript heap out of memory,怎么解決
這是堆棧溢出錯(cuò)誤。
可能的原因及解決辦法:
1、查看代碼是否有死循環(huán)、是否有無(wú)法結(jié)束的函數(shù)調(diào)用或遞歸調(diào)用。
2、也有可能是網(wǎng)頁(yè)上含有病毒腳本,對(duì)瀏覽器進(jìn)行了堆棧溢出攻擊,要?dú)⒍咎幚怼?/p>
3、瀏覽器打開(kāi)網(wǎng)頁(yè)過(guò)多,導(dǎo)致堆棧耗盡或?yàn)g覽器由于其它原因奔潰了,重啟瀏覽器試試。
4、重啟系統(tǒng)試試。
5、最壞情況,重裝瀏覽器或系統(tǒng)試試。
怎樣避免JavaScript中過(guò)長(zhǎng)遞歸導(dǎo)致的堆棧溢出
遞歸最容易導(dǎo)致的問(wèn)題就是堆棧溢出了,一般來(lái)說(shuō)操作系統(tǒng)給一個(gè)進(jìn)程劃分的棧內(nèi)存是2M(好像是),按照正常的程序處理,局部變量進(jìn)棧出棧,棧不太可能會(huì)溢出,但是遞歸會(huì)導(dǎo)致不會(huì)出棧,這就有可能導(dǎo)致堆棧溢出,你這里定義兩個(gè)int型變量,即8字節(jié),再加上保存的函數(shù)地址等信息,*100000次遞歸,還有一些其他的入棧的局部變量,可能已經(jīng)超出了最大的棧空間,所以溢出。
分享名稱:javascript溢出,js堆棧溢出
文章源于:http://fisionsoft.com.cn/article/dsdpegj.html