一、setTimeout簡介
setTimeout是Node.js提供的一個全局函數,用於在指定時間後執行一個回調函數。
setTimeout(callback, delay, [arg], [...])
其中,callback是被調用的函數,delay是延遲時間(單位為毫秒),arg是被傳遞給callback的參數(可選)。
二、使用setTimeout執行延時操作
setTimeout最常用的場景是執行延時操作。
console.log('start');
setTimeout(function() {
console.log('delayed operation');
}, 3000);
console.log('end');
上面代碼的輸出結果為:
start end delayed operation
可以看到,delayed operation是在start和end之後3秒鐘才被輸出的。這就說明了setTimeout的延時特性。
三、使用setTimeout執行周期性操作
setTimeout除了可以執行延時操作,還可以執行周期性操作。
console.log('start');
setTimeout(function repeat() {
console.log('repeated operation');
setTimeout(repeat, 1000);
}, 1000);
console.log('end');
上面代碼的輸出結果為:
start end repeated operation repeated operation repeated operation ...
可以看到,repeated operation是每間隔1秒鐘就被輸出一次的。這是因為在每次執行完callback之後,我們在callback內部又設置了下一次的setTimeout。
四、setTimeout的返回值和取消操作
setTimeout的返回值是一個唯一的定時器標識符(timer identifier),可以用來取消操作。
var timerId = setTimeout(function() {
console.log('delayed operation');
}, 3000);
console.log(timerId); // 輸出一個非零整數
clearTimeout(timerId);
console.log(timerId); // 輸出undefined
上面的代碼根據timerId來取消了setTimeout操作。clearTimeout函數的參數即為setTimeout返回的timer identifier。
五、setTimeout的內存泄漏問題
使用setTimeout時需要注意內存泄漏問題。如果一個回調函數包含了對它外部的資源的引用,那麼這個回調函數不會被及時清理,從而導致引用的資源也無法及時清理,造成內存泄漏。
function log() {
console.log('Operation done!');
}
console.log('start');
setTimeout(log, 3000);
console.log('end');
上面代碼中的log函數引用了console對象,而console對象是個全局對象。因此,在回調函數執行前,它是不會被清理的,而我們在回調函數裡面沒有再次引用console對象,使得console對象也無法得到及時的清理,從而造成了內存泄漏。
解決這個問題的方法是通過閉包使得回調函數內部不引用外部的資源。
function log() {
return function() {
console.log('Operation done!');
}
}
console.log('start');
setTimeout(log(), 3000);
console.log('end');
通過返回一個函數,在回調函數內部執行操作,這樣就避免了回調函數引用了外部資源的問題。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/236966.html