js中setTimeout问题

一、js每隔一秒打印1,2,3…

for (var i=1; i<=5; i++) {
    setTimeout( ()=> {
        console.log( i );
    }, i*1000 );        //每隔一秒输出6
}

定时器并不是同步的,它会自动插入任务队列,等待当前文件的所有同步代码和当前任务队列里的已有事件全部运行完毕后才能执行。这时候 i 就是6 了,所以会输出⼀堆 6 。

开启了5个定时器,时间分别是1s、2s、3s、4s、5s

解决办法
1.使用闭包(立即执行函数)

console.log("11111")
for(var i = 0; i < 5; i++) {
    (function(i) {
    console.log("3333")
        setTimeout( ()=> {
            console.log( i );
        }, i*1000 );
    })(i)
}
console.log("2222")   
 //输出结果:11111  3333 333 333 333 333 2222

也是生成了5个定时器,时间分别是1s、2s、3s、4s、5s。定时器是同时执行,所以就会有了每个1s输出一个值。

  1. 使用let关键字
for(let i = 0; i < 5; i++) {
    setTimeout(function () {
        console.log(i);
    }, i*1000 );
}

在for循环中使用let来定义循环变量有一个特殊效果:每一次循环都会重新声明变量i,随后的每个循环都会使用上一个循环结束时的值来初始化这个变量i。

  1. 使⽤ setTimeout 的第三个参数
for(var i=0;i<6;i++){
    	setTimeout(function(j){
        	console.log(j);
    	},i*1000,i);
}

第三个参数 就是给setTimeout第一个函数的参数

二、定时器越走越快
定时器越走越快,其实并不是定时器越走越快,而是有多个定时器在执行,定时器里面的程序执行的频率提高了。所以每次点击开启定时器之前,要先清除上一个定时器。
三、面试题alert是否会打印?

var t=true;
window.setTimeout(function(){
	t=false;
},1000);
while(t){

}
alert('end');

不会打印
setTimeout是异步线程,需要等待js引擎处理完同步代码(while语句)之后才会执行。但是现在while语句直接是个死循环,js引擎没有空闲,不会执行下面的alert,也不会插入setTimeout。所以即使这个时候把setTimeout的时间改成0,他还是不会执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值