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

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

一道js面試題

一道js面試題

ibeautiful 2018-08-01 14:21:27
for(var i=0; i<10; i++){  setTimeout(function() {    console.log(i);  },0)}請問輸出什么?如果要輸出'0123456789',要怎么改?
查看完整描述

3 回答

?
開滿天機

TA貢獻1786條經驗 獲得超13個贊

最簡單的方法 var 改成let 這是es6的方式

沒有es6的話 還是用原始的閉包吧 
for (var i = 0; i < 10; i++) {

(function(j) {
    setTimeout(function timer() {
        console.log(j);
    }, 0);})(i);

}


查看完整回答
反對 回復 2018-08-05
?
慕的地6264312

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

最簡單的:
for (var i = 0;i < 10;i++) {
    console.log(i);
}


查看完整回答
反對 回復 2018-08-05
?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

上面各位說得很全面了,推薦將 var 替換為 let擁抱 es6 吧。

for(let i=0; i<10; i++){
  setTimeout(function() {    
      console.log(i);
  },0)
}

這里簡單說明一下為什么如此替換會有效。

  1. var 命令聲明的變量,在全局范圍內有效。例中代碼,全局只有一個變量 i。每一次循環,i 的值均會改變,而console.log(i) 里面的 i 指向的就是全局的 i,導致運行時輸出的是最后一輪的 i 的值,即 10。

  2. let 命令聲明的變量,僅在塊級作用域內有效。修改后的代碼,每一次循環的 i 都是一個新的變量,所以最后輸出0123456789。

另外一點,如果每一輪循環的變量 i 均為重新聲明,那它怎么知道上一輪循環的值?
因為記得。JavaScript 引擎內部會記住上一輪循環的值,初始化本輪的變量 i 時,就在上一輪循環的基礎上進行計算。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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