Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中意外的setTimeOut()函数行为_Javascript - Fatal编程技术网

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

JavaScript中意外的setTimeOut()函数行为,javascript,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);

我在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秒
,因为上面的每一行需要1000毫秒才能执行,即总共5000毫秒=5秒

但结果显示,实际答案是选项
A)1秒

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


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

因为setTimeout是异步工作的,这意味着所有这5条语句都将同时执行,并且所有这些语句都将开始等待1秒。一秒钟后,一切都将被执行。希望天气转晴

因为setTimeout是异步工作的,这意味着这5条语句将同时执行,并且所有这些语句都将开始等待1秒。一秒钟后,一切都将被执行。希望天气转晴

从页面:

setTimeout()方法。。。设置一个计时器,该计时器执行 计时器过期后,函数或指定的代码段

从页面:

setTimeout()方法。。。设置一个计时器,该计时器执行 计时器过期后,函数或指定的代码段


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

如果你想在最后5秒钟内完成这项任务,你可以采取以下行动:

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

    setTimeout(function() { 
        console.log("Second task");
    },1000);
},1000);
这将执行第一个任务,一旦调用,它将执行第二个任务


编辑:我看到了另一篇关于非异步的帖子,你想避免在JavaScript中做任何非异步的事情,因为它会阻塞浏览器,这是一种不好的做法,用户体验也不好

当你调用setTimeout时,每次调用都会在它自己的后台线程(它自己独特的操作)中运行,您告诉JavaScript您希望在1秒后执行代码

如果你想在最后5秒钟内完成这项任务,你可以采取以下行动:

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

    setTimeout(function() { 
        console.log("Second task");
    },1000);
},1000);
这将执行第一个任务,一旦调用,它将执行第二个任务



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

这些都不正确
console.log(“hi”)
未包装在
函数中,因此它将立即执行。您还有一个额外的
,因此这可能不是实际的代码。问题键入错误。它必须是
setTimeout(function(){console.log(“hi”)},1000)。setTimeOut是错误的,我们需要一个console.log周围的函数,并且应该删除最后一个括号!然后,答案正如它所说的,由于setTimeout的异步行为,它将立即返回并在指定的时间运行回调。我删除了额外的
。它们是写错的@科比看到这一点是为了完全理解为什么会发生这样的事情。这些都不正确
console.log(“hi”)
未包装在
函数中,因此它将立即执行。您还有一个额外的
,因此这可能不是实际的代码。问题键入错误。它必须是
setTimeout(function(){console.log(“hi”)},1000)。setTimeOut是错误的,我们需要一个console.log周围的函数,并且应该删除最后一个括号!然后,答案正如它所说的,由于setTimeout的异步行为,它将立即返回并在指定的时间运行回调。我删除了额外的
。它们是写错的@Kobi看到这一点就完全理解了为什么会发生这种情况。如果我想同步运行它们呢?我需要添加什么额外的代码@Asim Khando你的意思是说第一次、第二次等所有设置超时将同时启动?这是异步的吗?@KeithMachado有不同的方法,可以在另一个超时内使用setTimeout,也可以使用setInterval(取决于场景)。@brk Yes。。那是异步的!如果我想同步运行它们呢?我需要添加什么额外的代码@Asim Khando你的意思是说第一次、第二次等所有设置超时将同时启动?这是异步的吗?@KeithMachado有不同的方法,可以在另一个超时内使用setTimeout,也可以使用setInterval(取决于场景)。@brk Yes。。那是异步的!第二个
setTimeOut
没有包装在
函数()中({}
不需要包装如果任务只是显示控制台的输出,这样1000毫秒将被忽略,console.log将立即执行(对于第二个/嵌套的setTimeOut)第二个
setTimeOut
没有包装在
函数()中({}
不需要包装如果任务只是显示控制台的输出,这样1000毫秒将被忽略,console.log将立即执行(对于第二个/嵌套的setTimeOut)