在js中,setTimeout()函數是全域變量,無論在哪裡它都是全域變數而不是局部變數。所以下面這個例子的結果可能會讓你大吃一驚:
function A() { this.b = function() { console.log(1) } } var c = new A() setTimeout(c.b, 10)
可能有些人認為上面這個例子輸出的結果是1,但是結果是undefined。這是因為setTImeout()函數是全域變量,它把裡面的c.b發到全域變數中,而全域變數中沒有b這個屬性,所以回傳的undefined。
在js中,setTimeout()函數的運作機制是這樣的,setInterval()函數也是一樣。將指定的程式碼移出本次執行,等到下一輪Event Loop時,再檢查是否到了指定時間。如果到了,就執行對應的程式碼;如果不到,就等到再下一輪Event Loop時重新判斷。這意味著,setTimeout指定的程式碼,必須等到本次執行的所有程式碼都執行完,才會執行。 ·
每回合Event Loop時,都會將「任務佇列」中需要執行的任務,一次執行完畢。 setTimeout和setInterval都是把任務加入到「任務佇列」的尾端。因此,它們實際上要等到目前腳本的所有同步任務執行完,然後再等到本次Event Loop的「任務佇列」的所有任務執行完,才會開始執行。由於前面的任務到底需要多少時間執行完,是不確定的,所以沒有辦法保證,setTimeout和setInterval指定的任務,一定會按照預定時間執行。
所以如果前面有一個函數被阻塞了,就一直等待函數執行完才能運作。因為js是單線程的,所以比較容易會發生阻塞的。
在setTimeout()函數中,最快的運作時間是4毫秒,即使將延遲參數寫為0或負數,它都不會立刻的運作。在延遲參數為0或負數時,需要等待當前腳步的同步任務和event loop(即任務隊列)執行完畢才開始執行,由於參數為0或負數,只是比其他setTimeout()函數盡可能早的運行函數,而參數為0或負數本身優先權相同。如:
setTimeout('console.log(1)',0) console.log(2)
回傳的結果是2 1
setTimeout('console.log(1)',0) setTimeout('console.log(2)',-1) setTimeout('console.log(3)',-1) setTimeout('console.log(4)',0)
回傳的結果是1 2 3 4
在setTimeout()中,還有一點值得注意的。那就是它的第一個參數必須是需要編譯的程式碼或是函數方法。所以像上面的例子中,console.log()被單引號括起來變成一個字串,在setTimeout中有一個eval()函數可以將字串進行編譯。如果我們將console.log()方法沒有用單引號括起來,那麼整個setTimeout()函數就會立即執行,而不會考慮有沒有延遲參數。如我在美的的美雲智數面試遇見過的這一題一樣:
console.log(1) setTimeout(console.log(2),0) console.log(3) setTimeout(console.log(4),-1)
返回的結果是1 2 3 4,如果將單引號括起來,返回的結果是1 3 2 4
在js中想要清除setTimeout計時器,需要clearTimeout()這個函數。具體用法如下所示:
var a = setTimeout('console.log(1)', 1) clearTimeout(a)
最後貼出一道題看看畢業了沒有,對比下面三段代碼,看分別輸出上面:
for (var i = 0; i < 3; i++) { setTimeout(function() { console.log(i); }, 0); console.log(i); }
for (var i = 0; i < 3; i++) { setTimeout((function() { console.log(i); })(i), 0); console.log(i); }
for (var i = 0; i < 3; i++) { setTimeout((function(i) { return function() { console.log(i); }; })(i), 0); console.log(i); }
這道題設計了一些js的作用域的問題,我會特別寫一篇文章介紹es5中作用域和es6中的作用域發生了哪些變化。
以上是js中的setTimeout()函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

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

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

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

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能