循环中赋值为引用的问题
/*
需求
需要一个可以延时显示1,2,3,4,5,6,7
*/
for (var i = 1; i < 8; i++) {
setTimeout(function timer() {
console.log(i)
}, i * 1000)
}
//执行结果 7次 8 达不到我们想要的效果
// 直接使用for循环 由于for是同步执行 而延时器是异步执行
// 会同步执行完之后再执行异步的 所以这里只能输出4次5
解决方式
// 1、使用立即执行函数的效果 让他立即执行
for (var i = 1; i < 8; i++) {
(fuction(j){
setTimeout(function timer() {
console.log(j)
}, j * 1000)
})(i)
}
//执行结果为 1 2 3 4 5 6 7
// 2、使用es6的let来使用
for (let i = 1; i < 5; i++) {
setTimeout(function timer() {
console.log(i)
}, i * 1000)
}
//执行结果为 1 2 3 4 5 6 7
//3、使用setTimeout的第三个参数
for (var i = 1; i < 8; i++) {
setTimeout(function timer(j) {
console.log(j)
}, i * 1000, i)
}
//执行结果为 1 2 3 4 5 6 7