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

Settimeout JavaScript函數:指南示例

Feb 10, 2025 pm 02:34 PM

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

熱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

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

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1327
25
PHP教程
1273
29
C# 教程
1252
24
JavaScript引擎:比較實施 JavaScript引擎:比較實施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

從C/C到JavaScript:所有工作方式 從C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

JavaScript和Web:核心功能和用例 JavaScript和Web:核心功能和用例 Apr 18, 2025 am 12:19 AM

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

JavaScript在行動中:現實世界中的示例和項目 JavaScript在行動中:現實世界中的示例和項目 Apr 19, 2025 am 12:13 AM

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

了解JavaScript引擎:實施詳細信息 了解JavaScript引擎:實施詳細信息 Apr 17, 2025 am 12:05 AM

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python vs. JavaScript:社區,圖書館和資源 Python vs. JavaScript:社區,圖書館和資源 Apr 15, 2025 am 12:16 AM

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

Python vs. JavaScript:開發環境和工具 Python vs. JavaScript:開發環境和工具 Apr 26, 2025 am 12:09 AM

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

See all articles