假設要生成一千萬個隨機數,常規的做法如下:
復制代碼 代碼如下:
var numbers = [];
for (var i = 0; i < 10000000; i++) {
numbers.push(Math.random());
}
然而,在IE下執行這段代碼時,卻彈出了一個窗口提示用戶是否停止這段腳本。出現這種情況,首先想到的是優化循環體。但明顯地,循環體很簡單,沒什麼優化的余地。即使把循環體清空,提示仍然存在。於是,我得出了一個結論:在IE下,一旦循環次數超過了某個特定值,就會彈出停止腳本的提示。
原因找到了,該如何解決呢?我首先想到的是把一千萬次循環分成若干個次數較少的循環。比如分成一百次,每次執行十萬次循環:
復制代碼 代碼如下:
for (var i = 0, j; i < 100; i++) {
for (j = 0; j < 100000; j++) {
......
}
}
IE沒有我們想象中笨,它知道總的循環次數還是一千萬次。因此,得把這一百個十萬次循環分開執行。雖然Javascript是單線程的,但也可以通過setTimeout或setInterval模擬多線程。整段代碼優化如下:
復制代碼 代碼如下:
var numbers = [];
function begin() {
for (var i = 0; i < 100000; i++) {
numbers.push(Math.random());
}
if (numbers.length < 10000000) { // 是否已完成
setTimeout(begin, 0);
} else {
alert("complete");
}
}
begin();