一次性输出
// 解法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
}