国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) web前端 js教程 Settimeout JavaScript函數(shù):指南示例

Settimeout JavaScript函數(shù):指南示例

Feb 10, 2025 pm 02:34 PM

setTimeout JavaScript Function: Guide with Examples

JavaScript 的 setTimeout 函數(shù)詳解:實(shí)現(xiàn)延遲執(zhí)行

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

關(guān)鍵要點(diǎn):

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

setTimeout 使用示例

以下代碼塊顯示了一個(gè)簡(jiǎn)單的示例,該示例將在 2 秒(2000 毫秒)的超時(shí)後將消息打印到控制臺(tái):

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

為了更詳細(xì)地演示這個(gè)概念,下面的演示在點(diǎn)擊按鈕兩秒鐘後顯示一個(gè)彈出窗口:(請(qǐng)?jiān)L問(wèn) CodePen 查看演示)

語(yǔ)法

根據(jù) MDN 文檔,setTimeout 的語(yǔ)法如下:

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 是一個(gè)數(shù)字 ID,可與 clearTimeout 結(jié)合使用以取消計(jì)時(shí)器。
  • scope 指的是 Window 接口或 WorkerGlobalScope 接口。
  • functionRef 是計(jì)時(shí)器到期後要執(zhí)行的函數(shù)。
  • code 是一種替代語(yǔ)法,允許您包含字符串而不是函數(shù),該字符串在計(jì)時(shí)器到期時(shí)進(jìn)行編譯和執(zhí)行。
  • delay 是函數(shù)調(diào)用應(yīng)延遲的毫秒數(shù)。如果省略,則默認(rèn)為 0。
  • arg1, ..., argN 是傳遞給 functionRef 指定的函數(shù)的其他參數(shù)。

注意:方括號(hào) [] 表示可選參數(shù)。

setTimeoutwindow.setTimeout

您會(huì)注意到,有時(shí)語(yǔ)法中包含 window.setTimeout。這是為什麼呢?

在瀏覽器中運(yùn)行代碼時(shí),scope 將指代全局 window 對(duì)象。 setTimeoutwindow.setTimeout 指的是同一個(gè)函數(shù),唯一的區(qū)別是,在第二個(gè)語(yǔ)句中,我們將 setTimeout 方法作為 window 對(duì)象的屬性來(lái)引用。

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

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

setTimeout 方法的使用示例

setTimeout 方法接受函數(shù)引用作為第一個(gè)參數(shù)。

這可以是函數(shù)的名稱(chēng):

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

引用函數(shù)的變量(函數(shù)表達(dá)式):

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])

或者匿名函數(shù):

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

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

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

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

  • 難以閱讀(因此難以維護(hù)和/或調(diào)試)。
  • 它使用隱式 eval,這是一種潛在的安全風(fēng)險(xiǎn)。
  • 它比替代方案慢,因?yàn)樗仨氄{(diào)用 JS 解釋器。

傳遞參數(shù)給 setTimeout

在基本場(chǎng)景中,首選的跨瀏覽器方法是使用匿名函數(shù)作為第一個(gè)參數(shù)將參數(shù)傳遞給 setTimeout 執(zhí)行的回調(diào)函數(shù)。

在下面的示例中,我們從 animals 數(shù)組中選擇一個(gè)隨機(jī)動(dòng)物,並將此隨機(jī)動(dòng)物作為參數(shù)傳遞給 makeTalk 函數(shù)。然後,setTimeout 以一秒的延遲執(zhí)行 makeTalk 函數(shù):

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

注意:我使用了一個(gè)常規(guī)函數(shù)(getRandom)從數(shù)組中返回一個(gè)隨機(jī)元素。也可以使用箭頭函數(shù)將其編寫(xiě)為函數(shù)表達(dá)式:

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

我們將在下一節(jié)介紹箭頭函數(shù)。這裡有一個(gè)包含上述代碼的 CodePen(您需要打開(kāi)控制臺(tái)才能查看輸出)。

替代方法

從文章頂部的語(yǔ)法可以看出,傳遞參數(shù)給 setTimeout 執(zhí)行的回調(diào)函數(shù)還有第二種方法。這涉及在延遲之後列出任何參數(shù)。

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

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 或以下版本中不起作用,其中參數(shù)作為 undefined 傳遞。如果您不幸需要支持 IE9,則 MDN 上提供了一個(gè) polyfill。

this 關(guān)鍵字的問(wèn)題

setTimeout 執(zhí)行的代碼在其與調(diào)用它的函數(shù)不同的執(zhí)行上下文中運(yùn)行。當(dāng) this 關(guān)鍵字的上下文很重要時(shí),這會(huì)成為問(wèn)題:

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

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

為了解決這個(gè)問(wèn)題,有各種方法……

顯式設(shè)置 this 的值

您可以使用bind 來(lái)實(shí)現(xiàn),bind 方法創(chuàng)建一個(gè)新函數(shù),當(dāng)調(diào)用該函數(shù)時(shí),其this 關(guān)鍵字將設(shè)置為提供的值(在本例中為dog 對(duì)象) 。這將給我們:

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])

使用庫(kù)

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

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

setTimeout 中使用箭頭函數(shù)

箭頭函數(shù)是在 ES6 中引入的。它們比常規(guī)函數(shù)的語(yǔ)法短得多:

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

當(dāng)然,您可以將它們與 setTimeout 一起使用,但是需要注意一點(diǎn)——箭頭函數(shù)沒(méi)有自己的 this 值。相反,它們使用封閉詞法上下文的 this 值。

使用常規(guī)函數(shù):

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

使用箭頭函數(shù):

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

在第二個(gè)示例中,this 指向全局 window 對(duì)象(同樣,它沒(méi)有 sound 屬性)。

這在將箭頭函數(shù)與 setTimeout 一起使用時(shí)可能會(huì)讓我們陷入困境。之前我們看到瞭如何為 setTimeout 中調(diào)用的函數(shù)提供正確的 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);

當(dāng)在引入的方法中使用箭頭函數(shù)時(shí),這將不起作用,因?yàn)榧^函數(shù)沒(méi)有它自己的 this 值。該方法仍將記錄 undefined。

使用箭頭函數(shù)和 setTimeout 編寫(xiě)更簡(jiǎn)潔的代碼

但是,因?yàn)榧^函數(shù)沒(méi)有自己的 this 值,所以它也可以為我們帶來(lái)優(yōu)勢(shì)。

考慮這樣的代碼:

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

可以使用箭頭函數(shù)更簡(jiǎn)潔地重寫(xiě)它:

setTimeout(makeTalk, 1000, randomAnimal);

如果您想了解箭頭函數(shù)的入門(mén)知識(shí),請(qǐng)閱讀“ES6 箭頭函數(shù):JavaScript 中簡(jiǎn)潔的語(yǔ)法”。

取消計(jì)時(shí)器

正如我們?cè)谖恼麻_(kāi)頭了解到的那樣,setTimeout 的返回值是一個(gè)數(shù)字 ID,可與 clearTimeout 函數(shù)結(jié)合使用以取消計(jì)時(shí)器:

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

讓我們看看它的實(shí)際效果。在下面的 Pen 中,如果您點(diǎn)擊“開(kāi)始倒計(jì)時(shí)”按鈕,倒計(jì)時(shí)將開(kāi)始。如果倒計(jì)時(shí)完成,小貓就贏(yíng)了。但是,如果您按下“停止倒計(jì)時(shí)”按鈕,計(jì)時(shí)器將被停止並重置。 (如果您在倒計(jì)時(shí)達(dá)到零時(shí)沒(méi)有看到很酷的效果,請(qǐng)使用嵌入底部右側(cè)的按鈕重新運(yùn)行 Pen。)

總結(jié)

在本文中,我演示瞭如何使用 setTimeout 來(lái)延遲函數(shù)的執(zhí)行。我還展示瞭如何將參數(shù)傳遞給 setTimeout,如何在其回調(diào)函數(shù)內(nèi)部維護(hù) this 值,以及如何取消計(jì)時(shí)器。

setTimeout JavaScript 函數(shù)的常見(jiàn)問(wèn)題解答

  • setTimeout 在 JavaScript 中是什麼?

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

  • setTimeout 如何工作?

    當(dāng)您調(diào)用 setTimeout 函數(shù)時(shí),您需要提供兩個(gè)參數(shù):要執(zhí)行的函數(shù)或代碼,以及以毫秒為單位的延遲。提供的函數(shù)/代碼將添加到隊(duì)列中,並在指定的延遲後,它將從隊(duì)列移動(dòng)到調(diào)用堆棧以執(zhí)行。

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

    是的,有替代方法,例如 setInterval,它會(huì)以指定的間隔重複執(zhí)行函數(shù),以及較新的 requestAnimationFrame,它用於更流暢的動(dòng)畫(huà)和更好的瀏覽器性能。

  • 什麼時(shí)候不應(yīng)該使用 setTimeout?

    setTimeout 是用於在 JavaScript 中調(diào)度異步代碼執(zhí)行的有用工具,但在某些情況下它可能不是最佳選擇。對(duì)於精確的動(dòng)畫(huà)或遊戲,您應(yīng)該使用 requestAnimationFrame。您不應(yīng)該嵌套多個(gè) setTimeout 調(diào)用;最好使用 Promise 或異步模式。 setTimeout 對(duì)小於 10 毫秒的延遲不準(zhǔn)確;請(qǐng)考慮替代方案。如果您正在構(gòu)建實(shí)時(shí)應(yīng)用程序(如在線(xiàn)多人遊戲或金融交易平臺(tái)),請(qǐng)選擇實(shí)時(shí)技術(shù),如 WebSockets。大型 CPU 密集型任務(wù)可能會(huì)阻塞事件循環(huán);如果需要,請(qǐng)使用 Web Workers。

  • 我可以取消 setTimeout 操作嗎?

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

  • setTimeoutsetInterval 之間的區(qū)別是什麼?

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

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

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

  • setTimeout 在 Node.js 中是什麼?

    setTimeout 是 Node.js 的內(nèi)置函數(shù),用於將給定函數(shù)或代碼塊的執(zhí)行延遲指定的毫秒數(shù)。

  • 如何在 Node.js 中使用 setTimeout?

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

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

    一些最佳實(shí)踐包括使用命名函數(shù)作為回調(diào)函數(shù),優(yōu)雅地處理錯(cuò)誤,並了解事件循環(huán)的行為以避免意外延遲或阻塞。此外,請(qǐng)考慮使用 setImmediate 在下一個(gè)事件循環(huán)週期中立即執(zhí)行。

(請(qǐng)注意,由於輸入文本中包含 CodePen 的鏈接,我無(wú)法直接在輸出中呈現(xiàn) CodePen 的內(nèi)容。您需要訪(fǎng)問(wèn)文中提供的鏈接來(lái)查看 CodePen 演示。)

以上是Settimeout JavaScript函數(shù):指南示例的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線(xiàn)上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門(mén)話(huà)題

Java vs. JavaScript:清除混亂 Java vs. JavaScript:清除混亂 Jun 20, 2025 am 12:27 AM

Java和JavaScript是不同的編程語(yǔ)言,各自適用於不同的應(yīng)用場(chǎng)景。 Java用於大型企業(yè)和移動(dòng)應(yīng)用開(kāi)發(fā),而JavaScript主要用於網(wǎng)頁(yè)開(kāi)發(fā)。

JavaScript評(píng)論:簡(jiǎn)短說(shuō)明 JavaScript評(píng)論:簡(jiǎn)短說(shuō)明 Jun 19, 2025 am 12:40 AM

JavascriptconcommentsenceenceEncorenceEnterential gransimenting,reading and guidingCodeeXecution.1)單inecommentsareusedforquickexplanations.2)多l(xiāng)inecommentsexplaincomplexlogicorprovideDocumentation.3)

如何在JS中與日期和時(shí)間合作? 如何在JS中與日期和時(shí)間合作? Jul 01, 2025 am 01:27 AM

JavaScript中的日期和時(shí)間處理需注意以下幾點(diǎn):1.創(chuàng)建Date對(duì)像有多種方式,推薦使用ISO格式字符串以保證兼容性;2.獲取和設(shè)置時(shí)間信息可用get和set方法,注意月份從0開(kāi)始;3.手動(dòng)格式化日期需拼接字符串,也可使用第三方庫(kù);4.處理時(shí)區(qū)問(wèn)題建議使用支持時(shí)區(qū)的庫(kù),如Luxon。掌握這些要點(diǎn)能有效避免常見(jiàn)錯(cuò)誤。

JavaScript與Java:開(kāi)發(fā)人員的全面比較 JavaScript與Java:開(kāi)發(fā)人員的全面比較 Jun 20, 2025 am 12:21 AM

JavaScriptIspreferredforredforwebdevelverment,而Javaisbetterforlarge-ScalebackendsystystemsandSandAndRoidApps.1)JavascriptexcelcelsincreatingInteractiveWebexperienceswebexperienceswithitswithitsdynamicnnamicnnamicnnamicnnamicnemicnemicnemicnemicnemicnemicnemicnemicnddommanipulation.2)

為什麼要將標(biāo)籤放在的底部? 為什麼要將標(biāo)籤放在的底部? Jul 02, 2025 am 01:22 AM

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

JavaScript:探索用於高效編碼的數(shù)據(jù)類(lèi)型 JavaScript:探索用於高效編碼的數(shù)據(jù)類(lèi)型 Jun 20, 2025 am 12:46 AM

javascripthassevenfundaMentalDatatypes:數(shù)字,弦,布爾值,未定義,null,object和symbol.1)numberSeadUble-eaduble-ecisionFormat,forwidevaluerangesbutbecautious.2)

什麼是在DOM中冒泡和捕獲的事件? 什麼是在DOM中冒泡和捕獲的事件? Jul 02, 2025 am 01:19 AM

事件捕獲和冒泡是DOM中事件傳播的兩個(gè)階段,捕獲是從頂層向下到目標(biāo)元素,冒泡是從目標(biāo)元素向上傳播到頂層。 1.事件捕獲通過(guò)addEventListener的useCapture參數(shù)設(shè)為true實(shí)現(xiàn);2.事件冒泡是默認(rèn)行為,useCapture設(shè)為false或省略;3.可使用event.stopPropagation()阻止事件傳播;4.冒泡支持事件委託,提高動(dòng)態(tài)內(nèi)容處理效率;5.捕獲可用於提前攔截事件,如日誌記錄或錯(cuò)誤處理。了解這兩個(gè)階段有助於精確控制JavaScript響應(yīng)用戶(hù)操作的時(shí)機(jī)和方式。

Java和JavaScript有什麼區(qū)別? Java和JavaScript有什麼區(qū)別? Jun 17, 2025 am 09:17 AM

Java和JavaScript是不同的編程語(yǔ)言。 1.Java是靜態(tài)類(lèi)型、編譯型語(yǔ)言,適用於企業(yè)應(yīng)用和大型系統(tǒng)。 2.JavaScript是動(dòng)態(tài)類(lèi)型、解釋型語(yǔ)言,主要用於網(wǎng)頁(yè)交互和前端開(kāi)發(fā)。

See all articles