簡單通過settimeout看javascript的運行機制
前言
我們知道JS是一個單線程的語言,而且其運行機制比較特殊。
下面我們通過settimeout的幾個示例來展現(xiàn)javascript的運行機制的特殊點
示例1
console.log(1); setTimeout(function(){ console.log(2); },0); console.log(3); // 打印出 1 3 2
示例2
console.log('1'); setTimeout(function(){ console.log('2'); },0); while(1){} // 打印出1,然后瀏覽器卡死,不會打印出2
javascript會先把需要運行的內(nèi)容放到任務(wù)隊列中
但是如果遇到settimeout,會認為這是個異步任務(wù),會先放到異步隊列中
瀏覽器會先執(zhí)行同步任務(wù),等到同步任務(wù)執(zhí)行完之后,再查看異步隊列
如果異步隊列中的任務(wù)的執(zhí)行時機到了,瀏覽器就會把任務(wù)放到同步隊列中去。
即:
異步任務(wù)一定在同步任務(wù)之后執(zhí)行。
示例3
for(var i = 0; i < 4; i++){ setTimeout(function() { console.log(i); }, 1000); } // 打印 4 4 4 4
為什么打印出的是4 4 4 4呢?
因為瀏覽器會先執(zhí)行for循環(huán)
每執(zhí)行一次for循環(huán),都把一個settimeout壓入異步隊列
1000毫秒之后,執(zhí)行settimeout里的方法的時候,i的值已經(jīng)是4了。
如果要打印0 1 2 3怎么辦呢?
利用閉包的特性,把i緩存到一個temp值里
for(var i = 0; i < 4; i++){ (function(temp){ setTimeout(function() { console.log(temp); }, 1000); })(i); } // 打印 0 1 2 3
這樣做等于是每一次for循環(huán)都新建了一個匿名函數(shù),i的值被存入了這個匿名函數(shù)的內(nèi)存里。
理解了閉包的同學(xué)一定可以理解這一點。
示例4
我們知道ES6引入了新的關(guān)鍵字let
在這里,let有一個新的特性
for(let i = 0; i < 4; i ++){ setTimeout(function(){ console.log(i); }, 1000); } // 打印 0 1 2 3
示例4與示例3只有var和let這個地方有區(qū)別,但是打印出來的結(jié)果卻完全不同
這是因為let是一個塊級作用域
let定義的i,對于每一個for循環(huán)的執(zhí)行來說都是一個全新的i(使用不同的內(nèi)存地址)
所以打印的時候可以得到0 1 2 3
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。
- JavaScript使用setTimeout實現(xiàn)倒計時效果
- JavaScript setTimeout()基本用法有哪些
- JavaScript setInterval()與setTimeout()計時器
- 如何通過setTimeout理解JS運行機制詳解
- 從setTimeout看js函數(shù)執(zhí)行過程
- js學(xué)使用setTimeout實現(xiàn)輪循動畫
- JavaScript計時器用法分析【setTimeout和clearTimeout】
- 詳解JS中定時器setInterval和setTImeout的this指向問題
- JavaScript中setTimeout的那些事兒
- JS關(guān)于for循環(huán)中使用setTimeout的四種解決方案
相關(guān)文章
JavaScript避免內(nèi)存泄露及內(nèi)存管理技巧
這篇文章主要介紹了JavaScript避免內(nèi)存泄露及內(nèi)存管理技巧,主要包括了delete應(yīng)用、閉包、DOM泄露、Timers計(定)時器泄露等等,需要的朋友可以參考下2014-09-09JavaScript數(shù)組every方法的應(yīng)用場景實例
every方法確定數(shù)組中的每一項的結(jié)果都滿足所寫的條件的時候,就會返回true,否則返回false,這篇文章主要給大家介紹了關(guān)于JavaScript數(shù)組every方法應(yīng)用場景的相關(guān)資料,需要的朋友可以參考下2022-12-12javascript實現(xiàn)仿IE頂部的可關(guān)閉警告條
仿windows IE頂部的敬告工具條,帶關(guān)閉按鈕,設(shè)計還算精美,你完全可以用到自己的網(wǎng)頁用于顯示提示等方面,有需要的小伙伴可以參考下。2015-05-05JavaScript this在函數(shù)中的指向及實例詳解
這篇文章主要介紹了JavaScript this在函數(shù)中的指向及實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-10-10