JavaScript中意外的setTimeOut()函数行为
我在Javascript MCQ测试中遇到了一个简单的问题(或者我认为是这样的问题):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);
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)