Node.js setTimeout詳解

一、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-tw/n/236966.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:02
下一篇 2024-12-12 12:02

相關推薦

  • JS Proxy(array)用法介紹

    JS Proxy(array)可以說是ES6中非常重要的一個特性,它可以代理一個數組,監聽數據變化並進行攔截、處理。在實際開發中,使用Proxy(array)可以方便地實現數據的監…

    編程 2025-04-29
  • 解析js base64並轉成unit

    本文將從多個方面詳細介紹js中如何解析base64編碼並轉成unit格式。 一、base64編碼解析 在JavaScript中解析base64編碼可以使用atob()函數,它會將b…

    編程 2025-04-29
  • Node.js使用Body-Parser處理HTTP POST請求時,特殊字元無法返回的解決方法

    本文將解決Node.js使用Body-Parser處理HTTP POST請求時,特殊字元無法返回的問題。同時,給出一些相關示例代碼,以幫助讀者更好的理解並處理這個問題。 一、問題解…

    編程 2025-04-29
  • t3.js:一個全能的JavaScript動態文本替換工具

    t3.js是一個非常流行的JavaScript動態文本替換工具,它是一個輕量級庫,能夠很容易地實現文本內容的遞增、遞減、替換、切換以及其他各種操作。在本文中,我們將從多個方面探討t…

    編程 2025-04-28
  • JS圖片沿著SVG路徑移動實現方法

    本文將為大家詳細介紹如何使用JS實現圖片沿著SVG路徑移動的效果,包括路徑製作、路徑效果、以及實現代碼等內容。 一、路徑製作 路徑的製作,我們需要使用到SVG,SVG是可縮放矢量圖…

    編程 2025-04-27
  • 如何解決Node.js中jwt.sign()響應過慢的問題

    本文將從多個方面探討如何解決Node.js中jwt.sign()響應過慢的問題,給出完整的代碼示例與最佳實踐,幫助開發者更好地處理這個問題。 一、問題概述 在使用Node.js編寫…

    編程 2025-04-27
  • 如何使用JS調用Python腳本

    本文將詳細介紹通過JS調用Python腳本的方法,包括使用Node.js、Python shell、child_process等三種方法,以及在Web應用中的應用。 一、使用Nod…

    編程 2025-04-27
  • 如何反混淆美團slider.js

    本文將從多個方面詳細闡述如何反混淆美團slider.js。在開始之前,需要明確的是,混淆是一種保護JavaScript代碼的方法,其目的是使代碼難以理解和修改。因此,在進行反混淆操…

    編程 2025-04-27
  • Python要學JS嗎?

    Python和JavaScript都是非常受歡迎的編程語言。然而,你可能會問,既然我已經學了Python,是不是也需要學一下JS呢?在本文中,我們將圍繞這個問題進行討論,並從多個角…

    編程 2025-04-27
  • 解決js ajax post 419問題

    對於使用ajax post請求時出現的419問題,我們需要進行以下幾個方面的闡述,包括返回碼的含義、可能出現的情況、解決方案等內容。 一、解析419返回碼 419返回碼錶示用戶超時…

    編程 2025-04-27

發表回復

登錄後才能評論