詳解怎麼檢測和防止JavaScript死循環
前言
Js死循環是怎麼造成的呢!其實在我們寫代碼時一些不註意或漏寫,就寫出死循環,就如下面代碼:
如果i++沒有寫上,這個就是死循環瞭,死循環的後果想知道的自己不防去試試。
死循環就是一段錯誤的阻止終止循環條件JavaScript代碼。
無限循環是危險的,因為它會導致您運行代碼的環境(瀏覽器或 NodeJS 服務器)崩潰或凍結您的計算機,導致它停止響應。
for和while語句是一個無限循環的常見原因,所以本教程將幫助您瞭解如何檢測和修復所造成的語句無限循環。
讓我們從修復for語句中的無限循環開始。
在 for 語句中修復無限循環
一個for語句可能會導致一個無限循環,當你錯誤的第二表達式把賦值運算符,而不是一個比較運營商(在條件表達式)
下面是一個for會導致無限循環的語句示例。註意第二個表達式是如何i = 10:
for (let i = 0; i = 10; i++) { console.log("Infinite loop"); }
該for語句要求第二個表達式的計算結果false為終止循環。在上面的示例中,賦值運算符i = 10被放置為條件表達式,而不是像i < 10or之類的比較運算符i > 10。
由於賦值運算符的計算結果始終為true,因此該for語句不會停止打印”Infinite loop”到控制臺,這可能會導致您的計算機死機。
要修復for上面的語句,您需要將第二個表達式替換為該for語句可以達到的內容。一個例子是使用比較運算符 ( =<, <, >, >=)
// the second expression is replaced with < for (let i = 0; i < 10; i++) { console.log("Infinite loop"); }
同樣的錯誤還有另一個版本。這一次,第一個表達式和第二個表達式導致無限循環:
for (let i = 5; i > 0; i++) { console.log("Infinite loop"); }
從上面的代碼可以看出,隻要變量i大於,循環就會繼續0。
由於 的值i已經大於0初始化時的值,因此第二個表達式將始終計算為true,從而導致無限循環。
為瞭修復上面的代碼,第三個表達式必須減少i而不是增加它的值:
for (let i = 5; i > 0; i--) { console.log("Infinite loop"); }
另一個for可能導致無限循環的語句示例是省略括號內的所有三個表達式,如下所示:
for (;;) { console.log("Infinite loop"); }
但是上面的代碼隻能是故意寫的,所以除非你想讓你的電腦崩潰,否則你不應該在你的項目中使用它。
盡管for您編寫的語句肯定會比上面的示例更復雜,但您仍然可以使用相同的原則來查找和修復語句中的錯誤。
首先,您需要確保放在for語句中的第二個表達式實際上可以計算為false.
如果第二個表達式已經正確,則開始檢查第一個和第三個表達式。第一個表達式是否初始化瞭一個true在執行第二個表達式時始終計算為的值?
最後,第三個表達式是否正確遞增或遞減第一個表達式中初始化的變量的值?
總結一下:首先檢查你的第二個表達式,然後按順序檢查第一個和第三個表達式。
接下來,讓我們學習如何修復由while語句引起的無限循環。
在 while 語句中修復無限循環
一個while語句可以導致無限循環,當條件表達式括號始終計算裡面放true:
while (true) { console.log("Infinite loop"); }
為瞭防止無限循環,while 語句的條件表達式必須能夠計算為false。
編寫while語句時最常見的錯誤之一是忘記修改用於條件表達式的變量的值。
請註意i以下示例中 never的值如何更改:
let i = 0; while (i < 6) { console.log("Infinite loop"); }
您需要增加語句體i內部的值,while以便在false執行循環時條件表達式的計算結果為:
let i = 0; while (i < 6) { console.log("Infinite loop"); i++; }
無論您的while語句多麼復雜,您都需要確保括號內的條件表達式while()可以計算為false.
如果仍然找不到導致無限循環的原因,則可以使用該console.log()語句打印條件表達式使用的變量的值:
let i = 0; while (i < 6) { console.log("Infinite loop"); i++; console.log(i); }
控制臺日志可以幫助您查明錯誤的代碼行並修復它。
總結
到此這篇關於怎麼檢測和防止JavaScript死循環的文章就介紹到這瞭,更多相關檢測和防止js死循環內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 前端 JavaScript運行原理
- nodejs 中的讀取文件fs模塊示例詳解
- Javascript運行機制之Event Loop
- 一文帶你徹底搞懂JavaScript正則表達式
- 從未有過的JavaScript運算符詳細解釋