改造下面的代码,使之输出0 - 9

360 阅读1分钟

一次性输出

// 解法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
}