改造下面的代碼,使之輸出0 - 9

一次性輸出

// 解法1:
for (var i = 0; i< 10; i++){
   setTimeout((i) => {
   console.log(i);//0,1,2,3,4,5,6,7,8,9
   }, 1000,i)
}

// 解法2:
for (var i = 0; i< 10; i++){
  setTimeout(((i) => {
	console.log(i);
    })(i), 1000)
}

// 解法3:
for (var i = 0; i< 10; i++){
   setTimeout((() => {
	console.log(i);
    })(), 1000)
}


// 解法4:
/* 利用 let 變量的特性 — 在每一次 for 循環的過程當中,
let 聲明的變量會在當前的塊級做用域裏面(for 循環的 body 體,
也即兩個花括號之間的內容區域)建立一個文法環境(Lexical Environment),
該環境裏面包括了當前 for 循環過程當中的 i;*/
for (let i = 0; i< 10; i++){
  setTimeout(() => {
    console.log(i);
  }, 1000)
}

等價於
for (let i = 0; i < 10; i++) {
  let _i = i;// const _i = i;
  setTimeout(() => {
    console.log(_i);
  }, 1000)
}

// 解法5:
for (var i = 0; i< 10; i++){
  ((i) => {
    setTimeout(() => {
      console.log(i);
    }, 1000)
 })(i)
}

//解法6:
let i = 0,
timer = setInterval(() => {
    i < 10 ?
    console.log(i++) :
    clearInterval(timer);
})

//解法7:
for (var i = 0; i < 10; i++) {
  setTimeout(console.log, 1000, i)
}


複製代碼

每一秒輸出

/*
    一秒輸出一個數字只須要在定時器後面乘以i便可,setTimeout第一個參數是當即執行的函數除外。
*/

//解法1
for (var i = 0; i< 10; i++){
  ((i) => {
    setTimeout(() => {
      console.log(i);
    }, 1000*i)
 })(i)
}

//解法2:
async function init(){
	for(var i = 0;i<10;i++){
		await timer1(i)
	}
}
function timer1(i){
	return new Promise((resolve)=>{
		setTimeout(()=>{
			console.log(i)//0,1,2,3,4,5,6,7,8,9
			resolve(true)
		},1000)
	})
}

init()
複製代碼

然而還有更簡單的方法

for(var i = 0;i < 10;i++){
    console.log(i)//0,1,2,3,4,5,6,7,8,9
}
複製代碼
相關文章
相關標籤/搜索