setTimeout學(xué)習(xí)小結(jié)
大致介紹
今天看了一篇文章,覺(jué)得寫得不錯(cuò),所以學(xué)習(xí)了一下,這篇博客是我自己的理解和總結(jié)
原文:你應(yīng)該知道的 setTimeout 秘密
主要內(nèi)容:
1、setTimeout原理
2、setTimeout(function(){..},0)的意義
3、setTimeout的this指向和參數(shù)問(wèn)題
setTimeout原理
先來(lái)看一段代碼:
var start = new Date(); setTimeout(function(){ console.log(new Date() - start); },500); while(new Date() - start <= 1000 ){}
最后輸出的是1003(可能數(shù)字不同,但是都大于1000)
之所以會(huì)輸出這樣的數(shù),是因?yàn)閳?zhí)行到setTimeout時(shí),會(huì)把其中的代碼經(jīng)過(guò)500ms后放到執(zhí)行隊(duì)列中,但是之后執(zhí)行while循環(huán),while循環(huán)會(huì)占據(jù)計(jì)算機(jī)資源,要占據(jù)1000ms,在這1000ms中執(zhí)行隊(duì)列中的任務(wù)都得等待,直到while循環(huán)結(jié)束
可以看出setTimeout的原理就是在經(jīng)過(guò)給定的時(shí)間后,將任務(wù)添加到隊(duì)列中,等待cpu調(diào)度執(zhí)行,它并不能保證任務(wù)在什么時(shí)候執(zhí)行
setTimeout(function(){..},0)的意義
有時(shí)候見(jiàn)過(guò)這樣的代碼:
setTimeout(function(){ //........... },0);
經(jīng)過(guò)前面的學(xué)習(xí),我會(huì)以為是當(dāng)代碼執(zhí)行到setTimeout時(shí),會(huì)立即將任務(wù)添加到執(zhí)行隊(duì)列中。其實(shí)不然,雖然給定的延遲執(zhí)行時(shí)間是0,但是setTimeout有自己的最小延遲時(shí)間(根據(jù)瀏覽器的不同而不同),所以即使寫了0s,但是setTimeout還是會(huì)在最小延遲時(shí)間后才添加任務(wù)到執(zhí)行隊(duì)列中
設(shè)置為0s的作用是為了可以改變?nèi)蝿?wù)的執(zhí)行順序!因?yàn)闉g覽器會(huì)在執(zhí)行完當(dāng)前任務(wù)隊(duì)列中的任務(wù),再執(zhí)行setTimeout隊(duì)列中積累的的任務(wù)
例如:
window.onload = function(){ document.querySelector('#one input').onkeydown = function(){ document.querySelector('#one span').innerHTML = this.value; }; document.querySelector('#two input').onkeydown = function(){ setTimeout(function(){ document.querySelector('#two span').innerHTML = document.querySelector('#two input').value; },0) } }
會(huì)產(chǎn)生這樣的問(wèn)題:
可以發(fā)現(xiàn)采用第一種寫法時(shí),只會(huì)獲取到鍵盤按下前,輸入框中的內(nèi)容
產(chǎn)生問(wèn)題的原因是當(dāng)我們按下鍵盤時(shí),JavaScript引擎會(huì)執(zhí)行keydown的事件處理程序,而更新輸入框中的值是在此之后執(zhí)行的,所以當(dāng)獲取輸入框中的值(this.value)時(shí),輸入框中的值還為更新。
解決方法就是利用setTimeout,在更新了輸入框的值后,在獲取它的值
setTimeout的this指向和參數(shù)問(wèn)題
setTimeout中回調(diào)函數(shù)的this是指向window的
例如:
var a = 1; var obj = { a : 2, output : function(){ setTimeout(function(){ console.log(a); },0); } } obj.output(); //1
但我們可以利用apply()、call()和bind()來(lái)改變this的指向
在setTimeout通常是兩個(gè)參數(shù),但是它可以由多個(gè)參數(shù)
例如:
setTimeout(function(a,b){ console.log(a); //2 console.log(b); //4 console.log(a + b); //6 },0,2,4);
可以看到,這些多的參數(shù)就是回調(diào)函數(shù)中要傳入的參數(shù)
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
- JS中setTimeout的巧妙用法前端函數(shù)節(jié)流
- 快速掌握Node.js中setTimeout和setInterval的使用方法
- JavaScript 定時(shí)器 SetTimeout之定時(shí)刷新窗口和關(guān)閉窗口(代碼超簡(jiǎn)單)
- JavaScript中SetInterval與setTimeout的用法詳解
- javascript中SetInterval與setTimeout的定時(shí)器用法
- JavaScript中setTimeout的那些事兒
- JavaScript中停止執(zhí)行setInterval和setTimeout事件的方法
- js中setTimeout()與clearTimeout()用法實(shí)例淺析
- Javascript的setTimeout()使用閉包特性時(shí)需要注意的問(wèn)題
- js中的setInterval和setTimeout使用實(shí)例
- js中settimeout方法加參數(shù)
相關(guān)文章
使用bootstraptable插件實(shí)現(xiàn)表格記錄的查詢、分頁(yè)、排序操作
這篇文章主要介紹了 使用bootstraptable插件實(shí)現(xiàn)表格記錄的查詢、分頁(yè)、排序操作,需要的朋友可以參考下2017-08-08微信小程序?qū)崿F(xiàn)登錄頁(yè)云層漂浮的動(dòng)畫效果
微信小程序目前的火熱程度相信不用多言,最近利用空余時(shí)間用小程序?qū)崿F(xiàn)了個(gè)動(dòng)態(tài)的登錄頁(yè)效果,所以下面這篇文章主要給大家介紹了利用微信小程序?qū)崿F(xiàn)登錄頁(yè)云層漂浮動(dòng)畫效果的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-05-05JS表單驗(yàn)證方法實(shí)例小結(jié)【電話、身份證號(hào)、Email、中文、特殊字符、身份證號(hào)等】
這篇文章主要介紹了JS表單驗(yàn)證方法,結(jié)合實(shí)例形式總結(jié)分析了常用的表單驗(yàn)證技巧,包括電話、身份證號(hào)、Email、中文、特殊字符、身份證號(hào)等驗(yàn)證方法,需要的朋友可以參考下2017-02-02js核心基礎(chǔ)之閉包的應(yīng)用實(shí)例分析
這篇文章主要介紹了js核心基礎(chǔ)之閉包的應(yīng)用,結(jié)合具體實(shí)例形式分析了javascript閉包使用過(guò)程中常見(jiàn)問(wèn)題及相應(yīng)的解決方法,需要的朋友可以參考下2019-05-05學(xué)習(xí)javascript面向?qū)ο?javascript實(shí)現(xiàn)繼承的方式
這篇文章主要為大家介紹了javascript實(shí)現(xiàn)繼承的方式,學(xué)習(xí)javascript面向?qū)ο螅信d趣的小伙伴們可以參考一下2016-01-01JavaScript實(shí)現(xiàn)簡(jiǎn)單的文本逐字打印效果示例
這篇文章主要介紹了JavaScript實(shí)現(xiàn)簡(jiǎn)單的文本逐字打印效果,涉及javascript結(jié)合時(shí)間函數(shù)動(dòng)態(tài)操作頁(yè)面元素相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-04-04javascript + jquery實(shí)現(xiàn)定時(shí)修改文章標(biāo)題
用javascript+jquery寫的一個(gè)定時(shí)器,定時(shí)修改文章標(biāo)題,需要的朋友可以參考下2014-03-03