如果要非同步執行一個函數,我們最先想到的方法一定會是setTimeout
例如:setTimeout(function( /* 1s後做點什麼 */){},1000}
那如果說要最快速地非同步執行一個函數呢?
是否會是:
setTimeout(function( /* 尽快做点什么 */){},0}
可惜的是,瀏覽器為了避免setTimeout嵌套可能出現卡死ui執行緒的情況,為setTimeout設定了最小的執行時間間隔,不同瀏覽器的最小執行時間間隔都不一樣。 chrome下測試 setTimeout 0 的實際執行時間間隔大概在12ms左右。
那如果想最快地非同步執行一個函數,有沒有什麼可以提速的方法呢?
先來看看瀏覽器端,有哪些常用的非同步執行方法
setImmediate:此方法去實作比setTimeout 0 更快的非同步執行,執行時間更接近0ms,但只有IE/node支援。
requestAnimationFrame:做動畫循環的時候常常會用到這個方法,該方法只會在瀏覽器刷新ui的時候執行,刷新ui的頻率最大一般為60fps,所以requestAnimationFrame一般情況下比setTimeout 0 更慢一些。
除了使用非同步函數外,還有一些方法可以實現非同步呼叫
利用onmessage:
和iframe通訊時常常會使用到onmessage方法,但是如果同一個window postMessage給自身,會怎麼樣呢?其實也相當於非同步執行了一個function
例如:
var doSth = function(){} window.addEventListener("message", doSth, true); window.postMessage("", "*");
<code><br>
另外,還可以利用script標籤,實現函數非同步執行,例如:
<code><br>
var newScript = document.createElement("script"); newScript.onreadystatechange = doSth; document.documentElement.appendChild(newScript);
<code><br>
把script加入文件也會執行onreadystatechange 但該方法只能在IE下瀏覽器使用。
那麼 這幾種方法,誰最快?
測試了一下,
chrome下:
setImmediate:不可用。
setTimeout 0:12ms
onmessage:6ms
onreadystatechange:不支援
chrome下,onmessage比setTimeout 0 更快。
firefox下:
setImmediate:不可用。
setTimeout 0:7ms
onmessage:7ms
onreadystatechange:不支援
firefox下,onmessage和setTimeout 0 速度相當。
IE9:
setImmediate:不可用。
setTimeout 0:11ms
onmessage:7ms 10ms
onreadystatechange:2ms
IE9下,onreadystatechange的時間比另外兩者快得多。
整體情況下,setImmediate 因此我們可以簡單封裝一個快速執行非同步function的方法:
var setZeroTimeout = (function(){ if(window.setImmediate){ //IE10+版本,使用原生setImmediate return window.setImmediate; } else if("onreadystatechange" in document.createElement("script")){ return function(){/* 使用onreadystatechange的版本 */} } else if(window.postMessage){ return function(){/* 使用onmessage的异步执行版本 */} } else { return window.setTimeout; } })();

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

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

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

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

從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應用程序可讓您從唱歌中為多個客戶提供服務


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver CS6
視覺化網頁開發工具

WebStorm Mac版
好用的JavaScript開發工具

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

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