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