面试之setTimeout

面试的时候会问到 setInterval 和 setTimeout 的区别,以及为什么要用后者代替前者?

setInterval 其实现在用的不是太多,它的一个问题在于,里面的函数不管有没有执行结束,它都会按照设定的间隔时间进行运行,这样难免对业务逻辑产生影响。

所以利用 setTimeout 可以替代模拟 setInterval ,就是递归的调用。

从表现形式上来看,2者都是跳出了Js 的当前执行流。

下面的这个 i 只会是 for 循环结束后的 i

for (var i = 0; i < 1000; i++) {
    setTimeout(function() {
        console.log(i);
    }, 0);
}

Javascript 是单线程的,对于回调和setTimeout setInterval 如果不做处理的话,那么整个浏览器就会假死了,肯定是不行的。

所以引入了 Callback Queue 的概念,而这个东西既不算是栈,也不能说是队列。由此也可以联想到回调事件。

setTimeout(function(argument) {
    console.log(1);
}, 5000);

setTimeout(function(argument) {
    console.log(2);
}, 2000);

setTimeout(function(argument) {
    console.log(3);
}, 0);

按照上面的代码,正常的执行流程肯定是从上到下,然而涉及到 setTimeout 的时间,如果是传统意义上的队列的话(队列的定义:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。),那么就应该是 5秒之后输出 1 2 3,但是实际情况是 3 2 1。

也就是说,碰到这类问题的时候,首先应该想到的是  Callback Queue 的概念,它是会在 js 标准的事件执行过程 call stack 里的事件执行完毕后再去执行   Callback Queue 中的事件,而此时的执行顺序就是会根据设定的时间长短来以此执行

欢迎分享本文,转载请保留出处:前端ABC » 面试之setTimeout

分享到:更多 ()

发表评论 0