亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

前端面試的一個小問題

前端面試的一個小問題

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

2 回答

?
精慕HU

TA貢獻1845條經驗 獲得超8個贊

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

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

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

比如,打開調試工具,設置斷點,如果執行到延時回調函數中斷點生效了,這時,代碼中的 setTimeout setInterval 等結果也都會受到影響。

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


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

TA貢獻1835條經驗 獲得超7個贊

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

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

這里創建了一個函數并立即調用了,函數的參數 i 被設置成 len 現在的值,然后它就不改了。所以它 alert 的值是 0-3 而不是 -1。

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


查看完整回答
反對 回復 2018-08-05
  • 2 回答
  • 0 關注
  • 1020 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號