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

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

一道考察JavaScript閉包的經典面試題有點不懂

一道考察JavaScript閉包的經典面試題有點不懂

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

2 回答

?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

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

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

  3. ES5沒有塊級作用域

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

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

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

這里使用了立即執行函數,創建了一個函數作用域,在這個作用域中有i的值,9個立即執行函數作用域中的值的分別為0-9

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


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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