鍍金池/ 問答/HTML  Office/ 一道js面試題

一道js面試題

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

請問輸出什么?
如果要輸出'0123456789',要怎么改?

回答
編輯回答
尐飯團

如果要輸出'0123456789',要怎么改?

難道不是:

console.log('0123456789')

這樣嗎?

2018年3月28日 04:09
編輯回答
亮瞎她

setTimeout(function () {

    for (var i=0;i<10;i++){
        console.log(i)
    }
},0)
2017年8月4日 13:20
編輯回答
有你在

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

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

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

  1. var 命令聲明的變量,在全局范圍內(nèi)有效。例中代碼,全局只有一個變量 i。每一次循環(huán),i 的值均會改變,而 console.log(i) 里面的 i 指向的就是全局的 i,導致運行時輸出的是最后一輪的 i 的值,即 10。
  2. let 命令聲明的變量,僅在塊級作用域內(nèi)有效。修改后的代碼,每一次循環(huán)的 i 都是一個新的變量,所以最后輸出 0123456789

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

2018年6月29日 15:57
編輯回答
柚稚

使用閉包:

const Greeters = []
for (let i = 0 ; i < 10 ; i++) {
  Greeters.push(function () { return console.log(i) })
}
Greeters[0]() // 0
Greeters[1]() // 1
Greeters[2]() // 2
2017年9月3日 01:58
編輯回答
悶騷型

原來的只會輸出10個10出來

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

輸出值為0123456789

2017年7月30日 10:48
編輯回答
孤島

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

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

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

}

2017年9月22日 19:29
編輯回答
使勁操

輸出為10次10,

輸出0123456789,可以試試這樣

    var a = '';
    for(var i = 0; i < 10; i++){
       a += i;
    }
    console.log('a', a);
2017年12月7日 02:48
編輯回答
孤島

這個會輸出10個10,因為setTimeout是異步加載.等他執(zhí)行的時候,i已經(jīng)全部成為10了.
如果要保留這個的值的話,可以使用閉包傳參的方式

for(var i=0; i<10; i++){
  // 調(diào)用閉包,保留i的值
  (function(i) {
    setTimeout(function() {
      console.log(i);
    },0)
  })(i); 
}
2018年5月4日 09:44
編輯回答
糖豆豆

這是經(jīng)典的閉包問題

for(var i=0; i<10; i++){
setTimeout(function() {

console.log(i);

},0)
}
這段代碼 會輸出10個10。
因為setTimeout會在for循環(huán)執(zhí)行之后才運行。所以for循環(huán)相當于定義了10個函數(shù):
function() {

console.log(i);

}

在for循環(huán)結束后,setTimeout觸發(fā),去運行之前的10個函數(shù),這是i為10.
所以輸出10個10.

要輸出0123456789
1.使用let

  1. 不使用閉包

for (var i = 0;i < 10;i++) {

console.log(i);

}

  1. 使用閉包, 用匿名函數(shù)

for(var i=0; i<10; i++){
(function(i){

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

})(i)
}

這個是很經(jīng)典的問題,建議樓主百度。這樣了解的會比較深刻

2018年6月26日 17:37
編輯回答
擱淺
for(let i=0; i<10; i++){
  setTimeout(function() {
    console.log(i);
  },0)
}
for(var i=0; i<10; i++){
  (function(i) {
    setTimeout(function() {
    console.log(i);
  },0)
  })(i)
  
}

用es6語法,或者加個iife傳i進去

2017年12月7日 00:30