谈谈setTimeout

今天了解了一下关于定时器setTimeout的知识。
js是单线程的,而定时器是计划在某个时间点进行的,不过没法保证确切的运行,因为很有可能js处于阻塞状态`

    function test(){
        var start=+new Date()
        var c;
        
        setInterval(function(){
             var endInterval = +new Date()
             console.log("定时器:"+(endInterval-start))
        },2000)
        for(var i=0;i<2000000000;i++){
            c=c+i
        }
        var end = +new Date()
        console.log("事件运行时间"+(end-start))

    }
    test()

运行结果
可以看到尽管定时器早就被创建,可是等js空闲下来才执行,中间跳过了两次。另外,如果每次定时器中的代码运行事件大于定时器间隔会怎样呢?

    function test() {
        var start = +new Date()
        var c;

        setInterval(function () {
            var endInterval = +new Date();
            console.log("定时器:" + (endInterval - start));
            for (var i = 0; i < 80000000; i++) {
                c = c + i
            };
            var end = +new Date();
            console.log("事件运行时间" + (end - start));
        }, 2000)
    }
    test()

在这里插入图片描述
定时器代码执行结束后会立刻执行下个定时器代码。
另外,这里发现一个问题,虽然会立刻执行下个定时器代码,为什么中间会差几十毫秒或者几毫秒呢?我在javaScript高级程序设计中找到了这样一段话可能就是答案:

执行 完 一套 代码 后, JavaScript 进程 返回 一段很短 的 时间, 这样 页 面上 的 其他 处理 就可以 进行 了。 由于 JavaScript 进程 会 阻塞 其他 页面 处理, 所以 必须 有 这些 小 间隔 来 防止 用户 界面 被 锁定( 代码 长时间 运行 中 还有 可能 出现)。 这样 设置 一个 定时器, 可以 确保 在 定时器 代码 执行 前 至少 有一个 进程 间隔。

如果不希望代码间隔被漏掉,而且阻塞的js空闲后立刻执行setInterval定时器,可以有如下解决办法:

    function test() {
        var start = +new Date()
        var c;

        setTimeout(function () {
            var endInterval = +new Date();
            console.log("定时器:" + (endInterval - start));
            for (var i = 0; i < 80000000; i++) {
                c = c + i
            };
            var end = +new Date();
            console.log("事件运行时间" + (end - start));
            setTimeout(arguments.callee,2000);
        }, 2000)
    }
    test()

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值