搜尋
首頁web前端js教程Settimeout JavaScript函數:指南示例

setTimeout JavaScript Function: Guide with Examples

JavaScript 的 setTimeout 函數詳解:實現延遲執行

setTimeout 是 JavaScript 中的原生函數,用於在指定延遲(毫秒)後調用函數或執行代碼片段。這在許多場景下非常有用,例如:在用戶瀏覽頁面一段時間後顯示彈出窗口,或在移除元素懸停效果前添加短暫延遲(防止誤操作)。

關鍵要點:

  • JavaScript 的 setTimeout 函數允許在指定毫秒數的延遲後執行函數或代碼片段,這對於諸如在一定瀏覽時間後顯示彈出窗口之類的任務非常有用。
  • setTimeout 接受函數引用作為第一個參數,該引用可以是函數名稱、引用函數的變量或匿名函數。它也可以執行代碼字符串,但不建議這樣做,因為這樣會降低可讀性、安全性並降低速度。
  • 可以使用匿名函數作為第一個參數,將參數傳遞給 setTimeout 執行的回調函數。但是,在延遲之後列出參數的替代方法與 IE9 及以下版本不兼容。
  • setTimeout 執行的代碼中,this 的值在與調用它的函數不同的執行上下文中運行,這在 this 關鍵字的上下文很重要時可能會導致問題。這可以使用 bind、庫函數或箭頭函數來解決。
  • setTimeout 的返回值是一個數字 ID,可用於結合 clearTimeout 函數取消計時器。

setTimeout 使用示例

以下代碼塊顯示了一個簡單的示例,該示例將在 2 秒(2000 毫秒)的超時後將消息打印到控制台:

function greet() {
  console.log('Howdy!');
}
setTimeout(greet, 2000);

為了更詳細地演示這個概念,下面的演示在點擊按鈕兩秒鐘後顯示一個彈出窗口:(請訪問 CodePen 查看演示)

語法

根據 MDN 文檔,setTimeout 的語法如下:

const timeoutID = setTimeout(code);
const timeoutID = setTimeout(code, delay);

const timeoutID = setTimeout(functionRef);
const timeoutID = setTimeout(functionRef, delay);
const timeoutID = setTimeout(functionRef, delay[, arg1, arg2, /* … ,*/ argN])

其中:

  • timeoutID 是一個數字 ID,可與 clearTimeout 結合使用以取消計時器。
  • scope 指的是 Window 接口或 WorkerGlobalScope 接口。
  • functionRef 是計時器到期後要執行的函數。
  • code 是一種替代語法,允許您包含字符串而不是函數,該字符串在計時器到期時進行編譯和執行。
  • delay 是函數調用應延遲的毫秒數。如果省略,則默認為 0。
  • arg1, ..., argN 是傳遞給 functionRef 指定的函數的其他參數。

注意:方括號 [] 表示可選參數。

setTimeoutwindow.setTimeout

您會注意到,有時語法中包含 window.setTimeout。這是為什麼呢?

在瀏覽器中運行代碼時,scope 將指代全局 window 對象。 setTimeoutwindow.setTimeout 指的是同一個函數,唯一的區別是,在第二個語句中,我們將 setTimeout 方法作為 window 對象的屬性來引用。

在我看來,這增加了複雜性,而好處卻微乎其微。如果您定義了另一種 setTimeout 方法,該方法將在作用域鏈中優先找到並返回,那麼您可能還有更大的問題需要擔心。

在本教程中,我將省略 window,但最終,您選擇哪種語法取決於您自己。

setTimeout 方法的使用示例

setTimeout 方法接受函數引用作為第一個參數。

這可以是函數的名稱:

function greet() {
  console.log('Howdy!');
}
setTimeout(greet, 2000);

引用函數的變量(函數表達式):

const timeoutID = setTimeout(code);
const timeoutID = setTimeout(code, delay);

const timeoutID = setTimeout(functionRef);
const timeoutID = setTimeout(functionRef, delay);
const timeoutID = setTimeout(functionRef, delay[, arg1, arg2, /* … ,*/ argN])

或者匿名函數:

function greet() {
  alert('Howdy!');
}
setTimeout(greet, 2000);

如上所述,也可以將代碼字符串傳遞給 setTimeout 以供其執行:

const greet = function() {
  alert('Howdy!');
};
setTimeout(greet, 2000);

但是,由於以下原因,不建議這樣做:

  • 難以閱讀(因此難以維護和/或調試)。
  • 它使用隱式 eval,這是一種潛在的安全風險。
  • 它比替代方案慢,因為它必須調用 JS 解釋器。

傳遞參數給 setTimeout

在基本場景中,首選的跨瀏覽器方法是使用匿名函數作為第一個參數將參數傳遞給 setTimeout 執行的回調函數。

在下面的示例中,我們從 animals 數組中選擇一個隨機動物,並將此隨機動物作為參數傳遞給 makeTalk 函數。然後,setTimeout 以一秒的延遲執行 makeTalk 函數:

setTimeout(() => { alert('Howdy!'); }, 2000);

注意:我使用了一個常規函數(getRandom)從數組中返回一個隨機元素。也可以使用箭頭函數將其編寫為函數表達式:

setTimeout('alert("Howdy!");', 2000);

我們將在下一節介紹箭頭函數。這裡有一個包含上述代碼的 CodePen(您需要打開控制台才能查看輸出)。

替代方法

從文章頂部的語法可以看出,傳遞參數給 setTimeout 執行的回調函數還有第二種方法。這涉及在延遲之後列出任何參數。

參考我們之前的示例,這將給我們:

function makeTalk(animal) {
  const noises = {
    cat: 'purr',
    dog: 'woof',
    cow: 'moo',
    pig: 'oink',
  }

  console.log(`A ${animal} goes ${noises[animal]}.`);
}

function getRandom(arr) {
  return arr[Math.floor(Math.random() * arr.length)];
}

const animals = ['cat', 'dog', 'cow', 'pig'];
const randomAnimal = getRandom(animals);

setTimeout(() => {
  makeTalk(randomAnimal);
}, 1000);

不幸的是,這在 IE9 或以下版本中不起作用,其中參數作為 undefined 傳遞。如果您不幸需要支持 IE9,則 MDN 上提供了一個 polyfill。

this 關鍵字的問題

setTimeout 執行的代碼在其與調用它的函數不同的執行上下文中運行。當 this 關鍵字的上下文很重要時,這會成為問題:

function greet() {
  console.log('Howdy!');
}
setTimeout(greet, 2000);

此輸出的原因是,在第一個示例中,this 指向dog 對象,而在第二個示例中,this 指向全局window 對象(它沒有sound 屬性) 。

為了解決這個問題,有各種方法……

顯式設置 this 的值

您可以使用bind 來實現,bind 方法創建一個新函數,當調用該函數時,其this 關鍵字將設置為提供的值(在本例中為dog 對象) 。這將給我們:

const timeoutID = setTimeout(code);
const timeoutID = setTimeout(code, delay);

const timeoutID = setTimeout(functionRef);
const timeoutID = setTimeout(functionRef, delay);
const timeoutID = setTimeout(functionRef, delay[, arg1, arg2, /* … ,*/ argN])

使用庫

許多庫都帶有內置函數來解決此問題。例如,jQuery 的 jQuery.proxy() 方法。它接受一個函數並返回一個新函數,該函數將始終具有特定上下文。在本例中,那將是:

function greet() {
  alert('Howdy!');
}
setTimeout(greet, 2000);

setTimeout 中使用箭頭函數

箭頭函數是在 ES6 中引入的。它們比常規函數的語法短得多:

const greet = function() {
  alert('Howdy!');
};
setTimeout(greet, 2000);

當然,您可以將它們與 setTimeout 一起使用,但是需要注意一點——箭頭函數沒有自己的 this 值。相反,它們使用封閉詞法上下文的 this 值。

使用常規函數:

setTimeout(() => { alert('Howdy!'); }, 2000);

使用箭頭函數:

setTimeout('alert("Howdy!");', 2000);

在第二個示例中,this 指向全局 window 對象(同樣,它沒有 sound 屬性)。

這在將箭頭函數與 setTimeout 一起使用時可能會讓我們陷入困境。之前我們看到瞭如何為 setTimeout 中調用的函數提供正確的 this 值:

function makeTalk(animal) {
  const noises = {
    cat: 'purr',
    dog: 'woof',
    cow: 'moo',
    pig: 'oink',
  }

  console.log(`A ${animal} goes ${noises[animal]}.`);
}

function getRandom(arr) {
  return arr[Math.floor(Math.random() * arr.length)];
}

const animals = ['cat', 'dog', 'cow', 'pig'];
const randomAnimal = getRandom(animals);

setTimeout(() => {
  makeTalk(randomAnimal);
}, 1000);

當在引入的方法中使用箭頭函數時,這將不起作用,因為箭頭函數沒有它自己的 this 值。該方法仍將記錄 undefined

使用箭頭函數和 setTimeout 編寫更簡潔的代碼

但是,因為箭頭函數沒有自己的 this 值,所以它也可以為我們帶來優勢。

考慮這樣的代碼:

const getRandom = arr => arr[Math.floor(Math.random() * arr.length)];

可以使用箭頭函數更簡潔地重寫它:

setTimeout(makeTalk, 1000, randomAnimal);

如果您想了解箭頭函數的入門知識,請閱讀“ES6 箭頭函數:JavaScript 中簡潔的語法”。

取消計時器

正如我們在文章開頭了解到的那樣,setTimeout 的返回值是一個數字 ID,可與 clearTimeout 函數結合使用以取消計時器:

function greet() {
  console.log('Howdy!');
}
setTimeout(greet, 2000);

讓我們看看它的實際效果。在下面的 Pen 中,如果您點擊“開始倒計時”按鈕,倒計時將開始。如果倒計時完成,小貓就贏了。但是,如果您按下“停止倒計時”按鈕,計時器將被停止並重置。 (如果您在倒計時達到零時沒有看到很酷的效果,請使用嵌入底部右側的按鈕重新運行 Pen。)

總結

在本文中,我演示瞭如何使用 setTimeout 來延遲函數的執行。我還展示瞭如何將參數傳遞給 setTimeout,如何在其回調函數內部維護 this 值,以及如何取消計時器。

setTimeout JavaScript 函數的常見問題解答

  • setTimeout 在 JavaScript 中是什麼?

    setTimeout 是 JavaScript 中的內置函數,允許您在指定的延遲(以毫秒為單位)後安排函數或代碼段的執行。

  • setTimeout 如何工作?

    當您調用 setTimeout 函數時,您需要提供兩個參數:要執行的函數或代碼,以及以毫秒為單位的延遲。提供的函數/代碼將添加到隊列中,並在指定的延遲後,它將從隊列移動到調用堆棧以執行。

  • 使用 setTimeout 的替代方法有哪些?

    是的,有替代方法,例如 setInterval,它會以指定的間隔重複執行函數,以及較新的 requestAnimationFrame,它用於更流暢的動畫和更好的瀏覽器性能。

  • 什麼時候不應該使用 setTimeout

    setTimeout 是用於在 JavaScript 中調度異步代碼執行的有用工具,但在某些情況下它可能不是最佳選擇。對於精確的動畫或遊戲,您應該使用 requestAnimationFrame。您不應該嵌套多個 setTimeout 調用;最好使用 Promise 或異步模式。 setTimeout 對小於 10 毫秒的延遲不准確;請考慮替代方案。如果您正在構建實時應用程序(如在線多人遊戲或金融交易平台),請選擇實時技術,如 WebSockets。大型 CPU 密集型任務可能會阻塞事件循環;如果需要,請使用 Web Workers。

  • 我可以取消 setTimeout 操作嗎?

    是的,您可以使用 clearTimeout 函數取消計劃的超時。它將 setTimeout 返回的超時 ID 作為參數。例如:const timeoutId = setTimeout(myFunction, 1000); clearTimeout(timeoutId);

  • setTimeoutsetInterval 之間的區別是什麼?

    setTimeout 將函數安排在指定的延遲後運行一次,而 setInterval 將函數安排在指定的間隔重複運行,直到它被取消或程序停止。

  • 我可以使用 setTimeout 的最小延遲值是多少?

    最小延遲值為 0,這意味著該函數安排在當前線程完成但處理任何掛起的事件之前執行。但是,計時器的實際粒度因不同的瀏覽器和環境而異。某些環境可能不支持小於 10 毫秒的延遲。

  • setTimeout 在 Node.js 中是什麼?

    setTimeout 是 Node.js 的內置函數,用於將給定函數或代碼塊的執行延遲指定的毫秒數。

  • 如何在 Node.js 中使用 setTimeout

    您可以按如下方式使用 setTimeout 函數:setTimeout(callback, delay); 其中 callback 是您希望在指定的毫秒延遲後執行的函數。

  • 在 Node.js 中使用 setTimeout 的最佳實踐有哪些?

    一些最佳實踐包括使用命名函數作為回調函數,優雅地處理錯誤,並了解事件循環的行為以避免意外延遲或阻塞。此外,請考慮使用 setImmediate 在下一個事件循環週期中立即執行。

(請注意,由於輸入文本中包含 CodePen 的鏈接,我無法直接在輸出中呈現 CodePen 的內容。您需要訪問文中提供的鏈接來查看 CodePen 演示。)

以上是Settimeout JavaScript函數:指南示例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python vs. JavaScript:開發人員的比較分析Python vs. JavaScript:開發人員的比較分析May 09, 2025 am 12:22 AM

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

Python vs. JavaScript:選擇合適的工具Python vs. JavaScript:選擇合適的工具May 08, 2025 am 12:10 AM

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript:了解每個的優勢Python和JavaScript:了解每個的優勢May 06, 2025 am 12:15 AM

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

JavaScript的核心:它是在C還是C上構建的?JavaScript的核心:它是在C還是C上構建的?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript應用程序:從前端到後端JavaScript應用程序:從前端到後端May 04, 2025 am 12:12 AM

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

Python vs. JavaScript:您應該學到哪種語言?Python vs. JavaScript:您應該學到哪種語言?May 03, 2025 am 12:10 AM

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架:為現代網絡開發提供動力JavaScript框架:為現代網絡開發提供動力May 02, 2025 am 12:04 AM

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

JavaScript,C和瀏覽器之間的關係JavaScript,C和瀏覽器之間的關係May 01, 2025 am 12:06 AM

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器