你真会用setTimeout吗?

教科书内里的setTimeout

定义很简朴
setTimeout() 要领用于在指定的毫秒数后挪用函数或盘算表达式。

广泛应用场景
定时器,轮播图,动画结果,自动转动等等

上面一些应当是setTimeout在人人心中的模样,由于我们寻常运用也不是许多。

然则setTimeout真的有那末简朴吗?

测试题

一个题目,如果你在一段代码中发现下面内容

    var startTime = new Date();
    setTimeout(function () {
        console.log(new Date() - startTime);
    }, 100)

叨教末了打印的是多少?
我以为准确答案是,取决于背面同步实行的js须要占用多少时候。
MAX(同步实行的时候, 100)

再加一个题目,只要下面代码

    setTimeout(function () {
        func1();
    }, 0)
    func2();

func1和func2谁会先实行?

这个答案应当比较简朴,func2先实行,func1背面实行。

再来一题

    setTimeout(function () {
        func1()
    }, 0)

    setTimeout(function () {
        func1()
    })

有什么差异?

0秒耽误,此回调将会放到一个能马上实行的时段举行触发。javascript代码大体上是自顶向下的,但中心穿插着有关DOM衬着,事宜回应等异步代码,他们将构成一个行列,零秒耽误将会完成插队操纵。
不写第二个参数,浏览器自动设置时候,在IE,FireFox中,第一次配可能给个很大的数字,100ms高低,往后会缩小到最小时候距离,Safari,chrome,opera则多为10ms高低。

上面答案来自《javascript框架设想》

好了,看了上面几个题目是否是觉得setTimeout不是设想中那样了。

setTimeout和单线程

下面是我本身的一些明白
起首须要注重javascript是单线程的,特性就是轻易涌现壅塞。如果一段顺序处置惩罚时候很长,很轻易致使全部页面hold住。什么交互都处置惩罚不了怎么办?

简化庞杂度?庞杂逻辑后端处置惩罚?html5的多线程?

上面都是ok的做法,然则setTimeout也是处置惩罚这类题目的一把好手。

setTimeout一个很症结的用法就是分片,如果一段顺序过大,我们能够拆分红多少微小的块。
比方上面的状况,我们将那一段庞杂的逻辑拆分处置惩罚,分片塞入行列。如许纵然在庞杂顺序没有处置惩罚完时,我们操纵页面,也是能获得纵然相应的。实在就是将交互插进去到了庞杂顺序中实行。

换一种思绪,上面就是应用setTimeout完成一种伪多线程的看法。

有个函数库Concurrent.Thread.js 就是完成js的多线程的。

一个简朴运用的例子,引入Concurrent.Thread.js

    Concurrent.Thread.create(function(){
        for (var i = 0;i<1000000;i++) {
            console.log(i);
        };
    });
    $('#test').click(function  () {
        alert(1);
    });

虽然有个庞大的轮回,然则这时候不阻碍你去触发alert();

是否是很凶猛~

另有一种场景,当我们须要衬着一个很庞杂的DOM时,比方table组件,庞杂的构图等等,如果全部历程须要3s,我们是守候完整处置惩罚完成在显现,照样运用一个setTimeout分片,将内容一片一片的断续显现。

实在setTimeout给了我们许多优化交互的空间。

怎样运用

setTimeout这么凶猛,那末我们是须要在在项目中大批运用吗?
我这边的看法是异常不发起,在我们营业中,基本上是制止在营业逻辑中运用setTimeout的,由于我所看到的许多运用体式格局都是一些题目不好处理,setTimeout作为一个hack的体式格局。
比方,当一个实例还没有初始化的前,我们就运用这个实例,毛病的处理办法是运用实例时加个setTimeout,确保实例先初始化。
为何毛病?这里实在就是运用hack的手腕
第一是埋下了坑,打乱模块的生命周期
第二是涌现题目时,setTimeout实际上是很难调试的。

我以为准确的运用体式格局是,看看生命周期(可参考《关于软件的生命周期 》),把实例化提到运用前实行。

综上,setTimeout实在想用好照样很难题的, 他更多的涌现是在框架和类库中,比方一些完成Promis的框架,就用上了setTimeout去完成异步。
所以如果你想去浏览一些源码,想去造一些轮子,setTimeout照样必不可少的东西。

微信民众号

《你真会用setTimeout吗?》

博客地址

http://tangguangyao.github.io/

    原文作者:YaoTang
    原文地址: https://segmentfault.com/a/1190000003982302
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞