电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

JS關(guān)于for循環(huán)中使用setTimeout的四種解決方案

瀏覽:90日期:2024-03-28 14:29:37
概述

我們先來簡(jiǎn)單了解一下setTimeout延時(shí)器的運(yùn)行機(jī)制。setTimeout會(huì)先將回調(diào)函數(shù)放到等待隊(duì)列中,等待區(qū)域內(nèi)其他主程序執(zhí)行完畢后,按時(shí)間順序先進(jìn)先出執(zhí)行回調(diào)函數(shù)。本質(zhì)上是作用域的問題。

因此若是這樣將不會(huì)得到想要的結(jié)果輸出1.2.3.4.5,而會(huì)連續(xù)輸出5個(gè)6。

for (var i=1; i<=5; i++) { setTimeout( function timer() {console.log( i ); }, i*1000 );}

這是因?yàn)閟etTimeout是異步執(zhí)行,每一次for循環(huán)的時(shí)候,setTimeout都執(zhí)行一次,但是里面的函數(shù)沒有被執(zhí)行,而是被放到了任務(wù)隊(duì)列里,等待執(zhí)行。只有主線上的任務(wù)執(zhí)行完,才會(huì)執(zhí)行任務(wù)隊(duì)列里的任務(wù)。也就是說它會(huì)等到for循環(huán)全部運(yùn)行完畢后,才會(huì)執(zhí)行fun函數(shù),但是當(dāng)for循環(huán)結(jié)束后此時(shí)i的值已經(jīng)變成了6,因此雖然定時(shí)器跑了5秒,控制臺(tái)上的內(nèi)容依然是6。

(注意:for循環(huán)從開始到結(jié)束的過程,需要維持幾微秒或幾毫秒,當(dāng)定時(shí)器跑完一秒之后for循環(huán)早已經(jīng)做完了。)

我們來看另一種情況:

for (var i=1; i<=5; i++) { (function() {setTimeout( function timer() { console.log( i );}, i*1000 ); })();}

由setTimeout的運(yùn)行機(jī)制可以知道,首先會(huì)運(yùn)行外部的所有主程序,雖然for循環(huán)內(nèi)形成了閉包,但是fun并沒有發(fā)現(xiàn)一個(gè)實(shí)參所以跟第一個(gè)例子并無實(shí)際差別,仍然是連續(xù)輸出5個(gè)6。

解決方案1:閉包

使用閉包是很經(jīng)典的一種做法:

for (var i=1; i<=5; i++) { (function(j) {setTimeout( function timer() { console.log( j );}, j*1000 ); })(i);}

我們可以發(fā)現(xiàn)跟預(yù)期結(jié)果一致,依次輸出1到5,因是因?yàn)閷?shí)際參數(shù)跟定時(shí)器內(nèi)部的i有強(qiáng)依賴。

通過閉包,將i的變量駐留在內(nèi)存中,當(dāng)輸出j時(shí),引用的是外部函數(shù)的變量值i,i的值是根據(jù)循環(huán)來的,執(zhí)行setTimeout時(shí)已經(jīng)確定了里面的的輸出了。

解決方案2:拆分結(jié)構(gòu)

我們還可以將setTimeout的定義和調(diào)用分別放到不同部分:

function timer(i) { setTimeout( console.log( i ), i*1000 );}for (var i=1; i<=5;i++) { timer(i);}

控制臺(tái)上輸出依然是依次輸出1到5。

解決方案3:let

這里再來說一說使用es6的let來解決此問題:

for (let i=1; i<=5; i++) { setTimeout( function timer() {console.log( i ); }, i*1000 );}

這個(gè)例子與第一個(gè)相比,只是把var更改成了let,可是控制臺(tái)的結(jié)果卻是依次輸出1到5。

因?yàn)閒or循環(huán)頭部的let不僅將i綁定到for循環(huán)中,事實(shí)上它將其重新綁定到循環(huán)體的每一次迭代中,確保上一次迭代結(jié)束的值重新被賦值。setTimeout里面的function()屬于一個(gè)新的域,通過var定義的變量是無法傳入到這個(gè)函數(shù)執(zhí)行域中的,通過使用let來聲明塊變量能作用于這個(gè)塊,所以function就能使用i這個(gè)變量了;這個(gè)匿名函數(shù)的參數(shù)作用域和for參數(shù)的作用域不一樣,是利用了這一點(diǎn)來完成的。這個(gè)匿名函數(shù)的作用域有點(diǎn)類似類的屬性,是可以被內(nèi)層方法使用的。

解決方案4:setTimeout第三個(gè)參數(shù)

for (let i=1; i<=5; i++) { setTimeout( function timer() {console.log( i ); }, i*1000, i );}

由于每次傳入的參數(shù)是從for循環(huán)里面取到的值,所以會(huì)依次輸出1到5。

以上就是JS關(guān)于for循環(huán)中使用setTimeout的四種解決方案的詳細(xì)內(nèi)容,更多關(guān)于JS使用setTimeout的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 粉末冶金-粉末冶金齿轮-粉末冶金零件厂家-东莞市正朗精密金属零件有限公司 | 耐破强度测试仪-纸箱破裂强度试验机-济南三泉中石单品站 | 健康管理师报名入口,2025年健康管理师考试时间信息网-网站首页 塑料造粒机「厂家直销」-莱州鑫瑞迪机械有限公司 | 蜗轮丝杆升降机-螺旋升降机-丝杠升降机厂家-润驰传动 | 车间除尘设备,VOCs废气处理,工业涂装流水线,伸缩式喷漆房,自动喷砂房,沸石转轮浓缩吸附,机器人喷粉线-山东创杰智慧 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 布袋除尘器-单机除尘器-脉冲除尘器-泊头市兴天环保设备有限公司 布袋除尘器|除尘器设备|除尘布袋|除尘设备_诺和环保设备 | 石家庄律师_石家庄刑事辩护律师_石家庄取保候审-河北万垚律师事务所 | 深圳宣传片制作-企业宣传视频制作-产品视频拍摄-产品动画制作-短视频拍摄制作公司 | 六维力传感器_六分量力传感器_模腔压力传感器-南京数智微传感科技有限公司 | 联系我们老街华纳娱乐公司官网19989979996(客服) | 北京开源多邦科技发展有限公司官网 | 广东风淋室_广东风淋室厂家_广东风淋室价格_广州开源_传递窗_FFU-广州开源净化科技有限公司 | 塑料脸盆批发,塑料盆生产厂家,临沂塑料广告盆,临沂家用塑料盆-临沂市永顺塑业 | 塑钢件_塑钢门窗配件_塑钢配件厂家-文安县启泰金属制品有限公司 深圳南财多媒体有限公司介绍 | 千斤顶,液压千斤顶-力良企业,专业的液压千斤顶制造商,shliliang.com | 板式换网器_柱式换网器_自动换网器-郑州海科熔体泵有限公司 | SDG吸附剂,SDG酸气吸附剂,干式酸性气体吸收剂生产厂家,超过20年生产使用经验。 - 富莱尔环保设备公司(原名天津市武清县环保设备厂) | 双效节能浓缩器-热回流提取浓缩机组-温州市利宏机械 | 我车网|我关心的汽车资讯_汽车图片_汽车生活! | 广州监控安装公司_远程监控_安防弱电工程_无线wifi覆盖_泉威安防科技 | 济南网站建设_济南网站制作_济南网站设计_济南网站建设公司_富库网络旗下模易宝_模板建站 | 安徽千住锡膏_安徽阿尔法锡膏锡条_安徽唯特偶锡膏_卡夫特胶水-芜湖荣亮电子科技有限公司 | 3d打印服务,3d打印汽车,三维扫描,硅胶复模,手板,快速模具,深圳市精速三维打印科技有限公司 | 涂层测厚仪_光泽度仪_uv能量计_紫外辐照计_太阳膜测试仪_透光率仪-林上科技 | 色谱柱-淋洗液罐-巴罗克试剂槽-巴氏吸管-5ml样品瓶-SBS液氮冻存管-上海希言科学仪器有限公司 | 济南网站建设_济南网站制作_济南网站设计_济南网站建设公司_富库网络旗下模易宝_模板建站 | 扒渣机厂家_扒渣机价格_矿用扒渣机_铣挖机_撬毛台车_襄阳永力通扒渣机公司 | 石家庄装修设计_室内家装设计_别墅装饰装修公司-石家庄金舍装饰官网 | 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 洗地机-全自动/手推式洗地机-扫地车厂家_扬子清洁设备 | 锂电混合机-新能源混合机-正极材料混料机-高镍,三元材料混料机-负极,包覆混合机-贝尔专业混合混料搅拌机械系统设备厂家 | 食品质构分析仪-氧化诱导分析仪-瞬态法导热系数仪|热冰百科 | 消防设施操作员考试报名时间,报名入口,报考条件 | 股指期货-期货开户-交易手续费佣金加1分-保证金低-期货公司排名靠前-万利信息开户 | 成都茶楼装修公司 - 会所设计/KTV装修 - 成都朗煜装饰公司 | 引领中高档酒店加盟_含舍·美素酒店品牌官网 | 西门子伺服电机维修,西门子电源模块维修,西门子驱动模块维修-上海渠利 | 伊卡洛斯软装首页-电动窗帘,别墅窗帘,定制窗帘,江浙沪1000+别墅窗帘案例 |