【问题标题】:Unexpected setTimeOut() function behavior in JavaScriptJavaScript 中的意外 setTimeOut() 函数行为
【发布时间】:2019-01-15 06:18:17
【问题描述】:

我在 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 秒

但在结果中,它说实际答案是Option A) 1 second

我在控制台中执行了这五行(总共),整个代码在 1 秒后执行,就像答案所说的那样。

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

【问题讨论】:

  • 这些都不正确。 console.log("hi") 没有包裹在 function 中,所以它会立即执行。你还有一个额外的),所以这可能不是实际代码。
  • 问题输入错误。它必须是setTimeout( function(){console.log("hi")}, 1000 );。 setTimeOut 是错误的,我们需要在 console.log 周围有一个函数,并且最后一个括号应该被删除!那么答案就是它所说的,由于 setTimeout 的异步行为,因为它会立即返回并在指定时间运行回调。
  • 我删除了多余的)。他们写错了。 @科比
  • youtube.com/watch?v=8aGhZQkoFbQ 看到这个完全理解为什么会发生。

标签: javascript


【解决方案1】:

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

【讨论】:

  • 如果我想同步运行它们怎么办?我需要添加哪些额外代码? @阿西姆汗
  • 你的意思是说第一个,第二个等等所有的setTimeout会同时开始吗?那是异步的吗?
  • @KeithMachado 有不同的方法,您可以在其他超时内使用 setTimeout,或者您可以使用 setInterval(取决于场景)。
  • @brk 是的.. 那是异步的!
【解决方案2】:

你让它在它自己的后台线程中运行的每个调用(它是自己独特的操作),当你调用 setTimeout 时,你是在告诉 JavaScript 你想在 1 秒过去后执行你的代码。

如果你想让这最后 5 秒,你会做一些类似的事情:

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

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

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

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

【讨论】:

  • 您的第二个 setTimeOut 未包含在 function() {}
  • 如果任务只是向控制台显示输出,则不需要包装
  • 不,这样 1000 毫秒将被忽略,console.log 将立即执行(对于您的第二个/嵌套 setTimeout)
【解决方案3】:

来自MDN 页面:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多