setTimeout |
setInterval |
||
---|---|---|---|
描述 | 實現的是根據給定的時間間隔,每隔一段時間調用一次函數或執行一次代碼 | 實現的是根據給定的時間,在通過該時間以後只調用一次函數或執行一次代碼 | |
語法 | setTimeout (callback, delay, arg1, ..., argn) |
setInterval (callback, interval, arg1, ..., argn) |
|
參數 | callback |
必需。要調用的函數或要執行的代碼串。(如果函數,則只須要寫函數名,能夠不加雙引號和括號) | |
delay / interval |
必需。在執行代碼前需等待的毫秒數。 | ||
arg1, ..., argn |
可選。給回調函數的傳參。 | ||
返回值 | 返回整型定時器id ,也就是這個setTimeout /setInterval 的惟一標示符。 |
||
取消定時器 | 利用 clearTimeout(id) 取消 |
||
運行機制 | |||
性能 | 性能較優 | ||
穩定性 | 更穩定 |
var interval = 3 * 1000, count = 0; function someOpration(){ var startTime = new Date(); console.log(startTime.toLocaleString() + " " + startTime.getMilliseconds()); var sum = 0; for(let i=0; i < 2000000000; i++){ sum += i; } var endTime = new Date(); console.log(endTime.toLocaleString() + " " + endTime.getMilliseconds()); var duration = endTime - startTime; console.log(duration); }
setTimeout 鏈式調用面試
function slow1(){ if(count < 5){ someOpration(); count = count + 1; setTimeout(slow1, interval); } } setTimeout(slow1, interval);
setInterval 實現函數
var interval = 3 * 1000, count = 0; function slow2(){ if(count < 5){ someOpration(); count = count + 1; } else { clearTimeout(timerId); } } var timerId = setInterval(slow2, interval)
for (var i = 1; i <= 2; i++) { setTimeout(function() { alert(i) }, 100); } // 3 // 3
for (var i = 1; i <= 2; ++i){ doSetTimeout(i); } function doSetTimeout(i) { setTimeout(function() { alert(i); }, 100); }
for (var i = 1; i <= 2; i++) { setTimeout(function(j) { console.log(j) }, 100, i); }