詳解怎么檢測(cè)和防止JavaScript死循環(huán)
前言
Js死循環(huán)是怎么造成的呢!其實(shí)在我們寫代碼時(shí)一些不注意或漏寫,就寫出死循環(huán),就如下面代碼:
如果i++沒有寫上,這個(gè)就是死循環(huán)了,死循環(huán)的后果想知道的自己不防去試試。
死循環(huán)就是一段錯(cuò)誤的阻止終止循環(huán)條件JavaScript代碼。
無(wú)限循環(huán)是危險(xiǎn)的,因?yàn)樗鼤?huì)導(dǎo)致您運(yùn)行代碼的環(huán)境(瀏覽器或 NodeJS 服務(wù)器)崩潰或凍結(jié)您的計(jì)算機(jī),導(dǎo)致它停止響應(yīng)。
for和while語(yǔ)句是一個(gè)無(wú)限循環(huán)的常見原因,所以本教程將幫助您了解如何檢測(cè)和修復(fù)所造成的語(yǔ)句無(wú)限循環(huán)。
讓我們從修復(fù)for語(yǔ)句中的無(wú)限循環(huán)開始。
在 for 語(yǔ)句中修復(fù)無(wú)限循環(huán)
一個(gè)for語(yǔ)句可能會(huì)導(dǎo)致一個(gè)無(wú)限循環(huán),當(dāng)你錯(cuò)誤的第二表達(dá)式把賦值運(yùn)算符,而不是一個(gè)比較運(yùn)營(yíng)商(在條件表達(dá)式)
下面是一個(gè)for會(huì)導(dǎo)致無(wú)限循環(huán)的語(yǔ)句示例。注意第二個(gè)表達(dá)式是如何i = 10:
for (let i = 0; i = 10; i++) { console.log("Infinite loop"); }
該for語(yǔ)句要求第二個(gè)表達(dá)式的計(jì)算結(jié)果false為終止循環(huán)。在上面的示例中,賦值運(yùn)算符i = 10被放置為條件表達(dá)式,而不是像i < 10or之類的比較運(yùn)算符i > 10。
由于賦值運(yùn)算符的計(jì)算結(jié)果始終為true,因此該for語(yǔ)句不會(huì)停止打印"Infinite loop"到控制臺(tái),這可能會(huì)導(dǎo)致您的計(jì)算機(jī)死機(jī)。
要修復(fù)for上面的語(yǔ)句,您需要將第二個(gè)表達(dá)式替換為該for語(yǔ)句可以達(dá)到的內(nèi)容。一個(gè)例子是使用比較運(yùn)算符 ( =<, <, >, >=)
// the second expression is replaced with < for (let i = 0; i < 10; i++) { console.log("Infinite loop"); }
同樣的錯(cuò)誤還有另一個(gè)版本。這一次,第一個(gè)表達(dá)式和第二個(gè)表達(dá)式導(dǎo)致無(wú)限循環(huán):
for (let i = 5; i > 0; i++) { console.log("Infinite loop"); }
從上面的代碼可以看出,只要變量i大于,循環(huán)就會(huì)繼續(xù)0。
由于 的值i已經(jīng)大于0初始化時(shí)的值,因此第二個(gè)表達(dá)式將始終計(jì)算為true,從而導(dǎo)致無(wú)限循環(huán)。
為了修復(fù)上面的代碼,第三個(gè)表達(dá)式必須減少i而不是增加它的值:
for (let i = 5; i > 0; i--) { console.log("Infinite loop"); }
另一個(gè)for可能導(dǎo)致無(wú)限循環(huán)的語(yǔ)句示例是省略括號(hào)內(nèi)的所有三個(gè)表達(dá)式,如下所示:
for (;;) { console.log("Infinite loop"); }
但是上面的代碼只能是故意寫的,所以除非你想讓你的電腦崩潰,否則你不應(yīng)該在你的項(xiàng)目中使用它。
盡管for您編寫的語(yǔ)句肯定會(huì)比上面的示例更復(fù)雜,但您仍然可以使用相同的原則來(lái)查找和修復(fù)語(yǔ)句中的錯(cuò)誤。
首先,您需要確保放在for語(yǔ)句中的第二個(gè)表達(dá)式實(shí)際上可以計(jì)算為false.
如果第二個(gè)表達(dá)式已經(jīng)正確,則開始檢查第一個(gè)和第三個(gè)表達(dá)式。第一個(gè)表達(dá)式是否初始化了一個(gè)true在執(zhí)行第二個(gè)表達(dá)式時(shí)始終計(jì)算為的值?
最后,第三個(gè)表達(dá)式是否正確遞增或遞減第一個(gè)表達(dá)式中初始化的變量的值?
總結(jié)一下:首先檢查你的第二個(gè)表達(dá)式,然后按順序檢查第一個(gè)和第三個(gè)表達(dá)式。
接下來(lái),讓我們學(xué)習(xí)如何修復(fù)由while語(yǔ)句引起的無(wú)限循環(huán)。
在 while 語(yǔ)句中修復(fù)無(wú)限循環(huán)
一個(gè)while語(yǔ)句可以導(dǎo)致無(wú)限循環(huán),當(dāng)條件表達(dá)式括號(hào)始終計(jì)算里面放true:
while (true) { console.log("Infinite loop"); }
為了防止無(wú)限循環(huán),while 語(yǔ)句的條件表達(dá)式必須能夠計(jì)算為false。
編寫while語(yǔ)句時(shí)最常見的錯(cuò)誤之一是忘記修改用于條件表達(dá)式的變量的值。
請(qǐng)注意i以下示例中 never的值如何更改:
let i = 0; while (i < 6) { console.log("Infinite loop"); }
您需要增加語(yǔ)句體i內(nèi)部的值,while以便在false執(zhí)行循環(huán)時(shí)條件表達(dá)式的計(jì)算結(jié)果為:
let i = 0; while (i < 6) { console.log("Infinite loop"); i++; }
無(wú)論您的while語(yǔ)句多么復(fù)雜,您都需要確保括號(hào)內(nèi)的條件表達(dá)式while()可以計(jì)算為false.
如果仍然找不到導(dǎo)致無(wú)限循環(huán)的原因,則可以使用該console.log()語(yǔ)句打印條件表達(dá)式使用的變量的值:
let i = 0; while (i < 6) { console.log("Infinite loop"); i++; console.log(i); }
控制臺(tái)日志可以幫助您查明錯(cuò)誤的代碼行并修復(fù)它。
總結(jié)
到此這篇關(guān)于怎么檢測(cè)和防止JavaScript死循環(huán)的文章就介紹到這了,更多相關(guān)檢測(cè)和防止js死循環(huán)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js前端實(shí)現(xiàn)登錄拼圖驗(yàn)證功能
行為驗(yàn)證碼通過用戶的操作來(lái)完成驗(yàn)證,常見的行為驗(yàn)證碼有拖動(dòng)式和點(diǎn)觸式,下面這篇文章主要給大家介紹了關(guān)于js前端實(shí)現(xiàn)登錄拼圖驗(yàn)證功能的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02深入了解Hybrid App技術(shù)的相關(guān)知識(shí)
這篇文章主要介紹了深入了解Hybrid App技術(shù)的相關(guān)知識(shí),Hybrid App(混合模式移動(dòng)應(yīng)用)是指介于web-app、native-app這兩者之間的app,兼具" Native App良好用戶交互體驗(yàn)的優(yōu)勢(shì) "和" Web App跨平臺(tái)開發(fā)的優(yōu)勢(shì) ",需要的朋友可以參考下2019-07-07微信小程序?qū)崿F(xiàn)YDUI的ScrollNav組件
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)YDUI的ScrollNav組件,滾動(dòng)導(dǎo)航效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02干貨分享:讓你分分鐘學(xué)會(huì)javascript閉包
干貨分享:讓你分分鐘學(xué)會(huì)javascript閉包,如何才能快速學(xué)會(huì)javascript閉包,本文為大家揭曉2015-12-12躲避這些會(huì)改變?cè)瓟?shù)組JavaScript數(shù)組方法讓開發(fā)流暢無(wú)阻
JavaScript中有些數(shù)組的操作方法并不符合我們預(yù)期,容易導(dǎo)致想象不到的結(jié)果,因此,為避免這種情況的發(fā)生,本文將介紹哪些原生數(shù)組方法能改變?cè)瓟?shù)組以及我對(duì)于如何更好地使用數(shù)組方法的建議2023-05-05