一次性輸出
// 解法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
}
複製代碼