JavaScript中意外的setTimeOut()函数行为

时间:2019-01-15 06:18:18

标签: javascript

我在Javascript MCQ测试中遇到了这个简单(或我认为是这样)的问题:

After how much time will the following code execute entirely?

setTimeOut(console.log("hi"),1000);
setTimeOut(console.log("hi"),1000);
setTimeOut(console.log("hi"),1000);
setTimeOut(console.log("hi"),1000);
setTimeOut(console.log("hi"),1000);

Options
    A) 1 second
    B) 2 seconds
    C) 4 seconds
    D) 5 seconds

我回答为选项D) 5 seconds,因为上面的每一行都需要1000毫秒来执行,即总计5000毫秒= 5秒

但是在结果中,它表示实际答案是选项A) 1 second

我在控制台中(总共)执行了这五行代码,并在1秒钟后执行了整个代码,如答案所示。

我不理解正确答案背后的逻辑,以及为什么我的推理是错误的。

3 个答案:

答案 0 :(得分:2)

因为setTimeout是异步工作的,这意味着所有这5条语句将同时执行,并且所有这些将开始等待1秒钟。一秒钟后将全部执行。希望它清除。

答案 1 :(得分:1)

每次调用都会使其在自己的后台线程中运行(这是自己的唯一操作),当调用setTimeout时,您是在告诉JavaScript您希望在1秒钟后执行代码。

如果要持续5秒钟,则可以执行以下操作:

setTimeout(function() {
    console.log("First task")

    setTimeout(function() { 
        console.log("Second task");
    },1000);
},1000);

这将执行第一个任务,一旦调用它将执行第二个任务

编辑:我看到了另一篇关于非异步的文章,您想避免在JavaScript中做任何非异步的事情,因为它会阻塞浏览器,这通常是一种不好的做法,并且会带来糟糕的用户体验

答案 2 :(得分:0)

MDN页上:

  

setTimeout()方法...设置一个计时器,该计时器执行   功能或指定的代码段,只要计时器到期即可。