首頁 web前端 js教程 JavaScript呼叫堆疊及setTimeout使用方法深入剖析_javascript技巧

JavaScript呼叫堆疊及setTimeout使用方法深入剖析_javascript技巧

May 16, 2016 pm 05:41 PM
settimeout 堆疊

Javascript中會經常用到setTimeout來推遲一個函數的執行,如:

複製代碼 代碼如下:

setTimeout(function(){alert("Hello World");},1000);

會在執行到這句話後延遲1秒鐘來彈出alert視窗。那麼再看這一段:
複製程式碼 程式碼如下:

function a(){
setTimeout(function() {alert(1)}, 0);
alert(2);
}
a();

注意這段程式碼中的setTimeout延遲設為了0,就是延遲0毫秒,貌似是不做任何延遲立刻執行,即1,2。但實際的執行結果確是2,1。為什麼?這得從Javascript呼叫堆疊(call stack)和setTimeout的功能說起。

首先,JavaScript是單執行緒的,也就是同一時間只執行一條程式碼,所以每一個JavaScript程式碼執行區塊會「阻塞」其它非同步事件的執行。其次,和其他的程式語言一樣,Javascript中的函數呼叫也是透過堆疊實現的。在執行函數a的時候,a先入棧,如果不給alert(1)加setTimeout,那麼alert(1)第2個入棧,最後是alert(2)。但現在在alert(1)加上setTimeout後,alert(1)被加入了一個新的堆疊中等待,並且「盡可能快」的執行。這個盡可能快就是指在a的堆疊完成後就立刻執行,因此實際的執行結果就是先alert(2),再alert(1)。在這裡setTimeout其實是讓alert(1)脫離了目前函式呼叫堆疊。看下面一個範例:
複製程式碼 程式碼如下:



這樣一段函數意圖是每輸入一個字元就把當前input裡的所有字元都alert出來,但實際效果確是alert出按鍵之前的內容。這裡,我們就可以利用setTimeout(0)來實作。
複製程式碼 程式碼如下:



這樣當onkeydown事件觸發的時候,alert就被放入了下一個呼叫堆疊,一旦onkeydown事件觸發的堆疊關閉後就開始執行。當然瀏覽器還有個onkeyup事件也可以實現我們的需求。

這樣的setTimeout用法在實際項目中還是會時常遇到。例如瀏覽器會聰明的等到一個函數堆疊結束後才改變DOM,如果再這個函數堆疊中把頁面背景先從白色設為紅色,再設回白色,那麼瀏覽器會認為DOM沒有發生任何改變而忽略這兩句話,因此我們可以透過setTimeout把「設回白色」函數加入下一個堆棧,那麼就可以確保背景顏色發生過改變了(雖然速度很快可能無法被察覺)。

總之,setTimeout增加了Javascript函數呼叫的彈性,為函數執行順序的調度提供極大便利。
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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

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

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

如何在iPhone上自訂和編輯待機模式:iOS 17的新功能 如何在iPhone上自訂和編輯待機模式:iOS 17的新功能 Sep 21, 2023 pm 04:01 PM

待機是iOS17更新中的一項新功能,它提供了一種新的增強方式,可以在手機快速閒置時存取資訊。透過StandBy,您可以輕鬆查看時間、查看即將發生的事件、瀏覽日曆、獲取您所在位置的天氣更新等等。啟動後,iPhone在充電時設定為橫向時會直觀地進入待機模式。此功能非常適合床頭櫃等無線充電點,或在日常任務中離開iPhone充電時。它允許您輕掃待機中顯示的各種小部件,以存取來自各種應用程式的不同資訊集。但是,您可能希望根據您的偏好和您經常需要的資訊修改這些小部件,甚至刪除一些小部件。因此,讓我們深入

iOS 17:如何在待機模式下自訂小工具 iOS 17:如何在待機模式下自訂小工具 Sep 17, 2023 pm 01:57 PM

待機是iOS17中一種新的可自訂鎖定螢幕模式,可在iPhone充電並側臥時啟動。可以將其視為iPhone的一種智慧顯示屏,例如,當您的裝置在廚房,書桌或床頭櫃上充電時,可以​​快速存取可以遠處查看的不同可瀏覽資訊螢幕。自訂備用構件待機由三個螢幕組成,可透過在iPhone顯示器上水平滑動來存取。第一個螢幕是互動式小工具的位置,而向左滑動會顯示第二個和第三個螢幕,分別顯示照片圖庫中的照片和大時鐘顯示。小部件螢幕由兩個並排顯示的互動式小部件堆疊組成,您可以獨立地上下滑動。這些堆疊就像主螢幕小工具堆疊

settimeout和setinterval有什麼差別 settimeout和setinterval有什麼差別 Aug 15, 2023 pm 02:06 PM

settimeout和setInterval的區別:1、觸發時間,settimeout是一次性的,它在設定延遲時間之後執行一次函數,而setinterval是重複性的,它會以設定的時間間隔重複執行函數;2、執行次數,settimeout只執行一次,而setinterval會一直重複執行,直到被取消。

深入探討Golang中堆疊的差異 深入探討Golang中堆疊的差異 Mar 13, 2024 pm 05:15 PM

Golang是一門廣受歡迎的程式語言,其在並發程式設計方面擁有獨特的設計理念。在Golang中,堆疊(heap和stack)的管理是一項非常重要的任務,對於理解Golang程式的運作機制至關重要。本文將深入探討Golang中堆疊的差異,並透過具體的程式碼範例來展示它們之間的差異和聯繫。在電腦科學中,堆疊是兩種常見的記憶體分配方式,它們在記憶體管理和資料儲存上有著不同

如何解決Java堆疊溢位異常 如何解決Java堆疊溢位異常 Nov 13, 2023 am 09:35 AM

解決Java堆疊溢出異常的方法有:1、修改程式碼邏輯,避免無限遞歸與循環依賴;2、增加Java虛擬機堆疊大小;3、使用尾遞歸最佳化;4、使用迭代替代遞歸;5、使用多執行緒。 Java堆疊溢位異常通常是由於遞歸呼叫太深或循環依賴導致的,當一個函數遞歸呼叫自身,並且沒有在某一點終止遞歸,就會導致堆疊溢位。這是因為每次函數呼叫都會在堆疊中新增一個新的堆疊幀,如果呼叫太多次,堆疊就會溢位。

堆積和棧的差別是什麼 堆積和棧的差別是什麼 Aug 10, 2023 am 10:12 AM

堆和棧的差別是:1、棧是一種線性資料結構,而堆則是一種樹狀的資料結構;2、棧的記憶體分配方式是自動的,而堆的記憶體分配與釋放需要手動管理;3、棧的記憶體分配速度相對較快,而堆的記憶體分配速度較慢;4、棧的大小是固定的,而堆的大小可以根據需要進行動態調整;5、棧適用於管理局部變量、函數呼叫和遞歸等,而堆適用於需要長時間儲存的資料、動態資料結構和大型資料等。

Java使用StackTraceElement類別追蹤方法呼叫堆疊 Java使用StackTraceElement類別追蹤方法呼叫堆疊 Jul 25, 2023 pm 03:21 PM

Java使用StackTraceElement類別追蹤方法呼叫堆疊引言:在軟體開發中,偵錯是一個非常重要的過程,它可以幫助我們定位問題並找出錯誤的根源。而在偵錯過程中,了解方法呼叫的堆疊情況可以幫助我們更快找出問題所在。 Java中,我們可以透過使用StackTraceElement類別來追蹤方法呼叫堆疊。一、StackTraceElement類別介紹:Stack

PHP SPL 資料結構:一個讓你的程式碼煥然一新的工具包 PHP SPL 資料結構:一個讓你的程式碼煥然一新的工具包 Feb 19, 2024 pm 12:09 PM

PHPSPL資料結構:概述phpSPL資料結構是PHP標準函式庫(SPL)中的一個元件,它提供了一組通用資料結構,包括堆疊、佇列、陣列和雜湊表。這些資料結構經過最佳化,可高效處理各種資料類型,並提供了一致的接口,簡化了應用程式開發。主要資料結構堆疊堆疊是一種遵循後進先出(LIFO)原則的有序集合。在堆疊中,最後一個新增的元素將是第一個被刪除的元素。 SPL提供了一個SplStack類別來表示堆疊。以下範例展示如何使用SplStack:$stack=newSplStack();$stack->push(1

See all articles