JavaScript呼叫堆疊及setTimeout使用方法深入剖析_javascript技巧
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函數呼叫的彈性,為函數執行順序的調度提供極大便利。

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

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

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

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

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