【问题标题】:Does setTimeout delay the creation of the function?setTimeout 会延迟函数的创建吗?
【发布时间】:2020-05-29 21:20:22
【问题描述】:

这不起作用,因为当“消息”不存在时正在创建“日志”。

function x() {
  function log() {
    console.log(message)
  }
  const message = "hello"
   log()
}

x()

但这有效吗? setTimeout 不知道该消息,在我看来,应该抛出一个错误。但似乎在“x”函数执行完成后正在创建“日志”?这是怎么解释的?

function x() {
  setTimeout(() => {
    console.log(message)
  }, 500)
  const message = "hello"
}

x()

【问题讨论】:

  • 第一个“不起作用”,因为你从不打电话给log()

标签: javascript closures settimeout


【解决方案1】:

我认为你误解了第一个 sn-p 代码的作用。

您正在定义一个函数x,它在其中定义一个函数log,然后将常量message 设置为“hello”;

在 sn-p 中的任何时候都不会调用 log 函数,因此永远不会调用 console.log(message);

在第二个 sn-p 中,您使用 setTimeout 调用将在 500 毫秒后运行的函数。

【讨论】:

  • 对不起,我的意思是在第一个 sn-p 中调用 log()。我只是不明白为什么第二个有效,因为变量是在回调发送到 settimeout 之后创建的。
【解决方案2】:

在第一个示例中,您没有调用您创建的log() 函数。 setTimeout 函数有效,因为它在给定时间后执行回调。

function x() {
  function log() {
    console.log(message)
  }
  const message = "hello"

  log();
}

x()

【讨论】:

  • 对不起,我的意思是在第一个 sn-p 中调用 log()。我只是不明白为什么第二个有效,因为变量是在回调发送到 settimeout 之后创建的
【解决方案3】:

这是因为事件循环,以及setTimeout 将回调函数作为参数这一事实。

基本上操作顺序如下

  1. 定义了名为 x 的函数
  2. 函数 x 被调用
  3. 函数 setTimeout 被调用
  4. 声明了名为 message 的常量变量
  5. 调用作为参数传递给 SetTimeout 的回调函数
  6. 控制台对象的日志方法被调用。

第一个代码 sn-p 不会登录到控制台,因为您没有调用函数 x 中定义的函数。您可以通过closure 访问变量,在第一个代码 sn-p 中将变量记录到控制台。

这应该适用于第一个代码 sn-p。

function x() {
  const message = "hello"
  return function() {
    console.log(message)
  }

}

x()()

另一种更简单的方法,就是在函数内调用函数:

function x() {
  function log() {
    console.log(message)
  }
  const message = "hello"
  log()
}

x()

【讨论】:

  • 您的解释完全正确。但是,问题不在于 timerevent-loop 在 JavaScript 中如何工作。这是语法错误问题之一。
  • 对不起,我的意思是在第一个 sn-p 中调用 log()。我只是不明白为什么第二个有效,因为变量是在回调发送到 settimeout 之后创建的
  • @Vehbi 在声明变量之前不会调用该函数。这就是为什么您不会收到错误消息。
猜你喜欢
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
相关资源
最近更新 更多