第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

前端面試的一個小問題

前端面試的一個小問題

月關(guān)寶盒 2018-08-01 22:38:00
昨天去一家公司面試前端,第二輪技術(shù)面給我出了一個題var len=4;while(len--){     setTimeout(function(){         alert(len);     },0);     alert(len); }問輸出結(jié)果當時有點蒙,自己不熟悉setTimeOut函數(shù)以為time為0就是立即調(diào)用,然后考官說setTimeOut是異步的,即使是0也會在最后執(zhí)行,結(jié)果輸出應該為3,2,1,0,-1,-1,-1,-1.后來又變了題目是:var len=4;while(len--){     (function(i){         setTimeout(function(){             alert(i);         },0);     })(len);     alert(len); }這次我就很清楚了,產(chǎn)生一個閉包,每次len的變化i都保存了一個copy,所以輸出是3,2,1,0,3,2,1,0.但是剛才寫demo的時候發(fā)現(xiàn)第一段代碼的輸出符合預期,第二段的輸出開始4個是3,2,1,0但是后面的也就是setTimeout中的輸出有時候都不一樣,有時是0,2,1,3有時是2,1,0,3等等求解釋。
查看完整描述

2 回答

?
精慕HU

TA貢獻1845條經(jīng)驗 獲得超8個贊

其實第二個題目的答案確實一定是:32103210。

之所以后面四個 alert 輸出 的結(jié)果有不確定性,和 setTimeout 以及延遲時間 都沒有關(guān)系,是因為,alert 會阻塞瀏覽器的執(zhí)行線程,而所有阻塞執(zhí)行線程的方式,都會讓setTimeout的結(jié)果具有不確定性。

(即便setTimeout的延遲時間為0,回調(diào)函數(shù)也是嚴格的壓入隊列棧中的,按照FIFO的順序依次調(diào)用。)

比如,打開調(diào)試工具,設置斷點,如果執(zhí)行到延時回調(diào)函數(shù)中斷點生效了,這時,代碼中的 setTimeout setInterval 等結(jié)果也都會受到影響。

遇到這種情況,最好的方式(比如此處),盡量使用【console.log】輸出結(jié)果,這樣只會將對象打印到控制臺,而不會影響時間性和順序。


查看完整回答
反對 回復 2018-08-05
?
qq_花開花謝_0

TA貢獻1835條經(jīng)驗 獲得超7個贊

前邊那個你理解了?那我只說后邊那個——閉包。

 (function(i){ setTimeout(function(){ alert(i); },0); })(len);

這里創(chuàng)建了一個函數(shù)并立即調(diào)用了,函數(shù)的參數(shù) i 被設置成 len 現(xiàn)在的值,然后它就不改了。所以它 alert 的值是 0-3 而不是 -1。

至于順序,都是延時 0 毫秒執(zhí)行,所以順序是亂的。


查看完整回答
反對 回復 2018-08-05
  • 2 回答
  • 0 關(guān)注
  • 1039 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號