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

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

一道考察JavaScript閉包的經(jīng)典面試題有點不懂

一道考察JavaScript閉包的經(jīng)典面試題有點不懂

幕布斯6054654 2018-08-03 08:22:21
for (var i = 0; i < 10; ++i) {     setTimeout(function () {console.log(i)}, 0); }請問為什么前面那個執(zhí)行之后輸出全都是10,后面那個就是0~9呢?for (var i = 0; i < 10; ++i) {     setTimeout((function () {console.log(i)})(), 0);}還有就是setTimeout的第二個參數(shù)為0該怎么理解?我百度了一下網(wǎng)上好像沒人能夠講清楚這個啊(網(wǎng)上有人說setTimeout是異步執(zhí)行,0的話會導致輸出亂序,但是事實上后面那個代碼段執(zhí)行是0~9的遞增數(shù)列,沒有亂啊,這到底是怎么回事呢?)
查看完整描述

2 回答

?
HUX布斯

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

  1. 通過setTimeout添加的事件是是存在事件隊列中的

  2. 當js線程有其他代碼運行時,不會取事件隊列中的函數(shù)運行

  3. ES5沒有塊級作用域

這就是說第一個for循環(huán)執(zhí)行時,那些函數(shù)都添加到事件隊列中了,當for運行完,開始取事件隊列中的函數(shù)運行,但是在那些個函數(shù)中沒有找到i,就會沿著作用域鏈向上查找,找到了i,但此時的i值是10,所以輸出的全是10

第二個你的寫法應該有錯誤,根本沒有使用閉包,就是直接執(zhí)行了函數(shù)

(function(i){
  return function(){
     console.log(i)
  }
})(i)

這里使用了立即執(zhí)行函數(shù),創(chuàng)建了一個函數(shù)作用域,在這個作用域中有i的值,9個立即執(zhí)行函數(shù)作用域中的值的分別為0-9

回到上面取事件隊列中的函數(shù)運行,沿作用域鏈查找時正好找到我們上面創(chuàng)建的立即執(zhí)行函數(shù)作用域中有i,于是就輸出了


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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