setTimeout是否会延迟函数的创建?

问题描述 投票:0回答:1

这不行,因为当 "log "被创建时,"message "并不存在。

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()
javascript closures settimeout
1个回答
0
投票

我想你误解了第一段代码的作用。

你定义了一个函数 x 其中定义了一个函数 log 内,然后设定一个恒定的 message 到 "hello"。

在该片段中,没有任何一点能使 log 函数被调用,所以 console.log(message); 永远不会被调用。

在第二个代码段中,您使用的是 setTimeout 来调用一个将在500ms后运行的函数。


0
投票

在第一个例子中,你没有调用 log() 函数的工作,因为它在给定时间后执行回调。setTimeout 函数工作的原因是它在给定时间后执行回调。

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

  log();
}

x()

0
投票

这是因为事件循环的原因,而且事实上 setTimeout 以一个回调函数作为参数。

基本上操作的顺序如下

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

第一个代码片段没有记录到控制台,因为你没有调用函数x中定义的函数。你可以在第一个代码片段中通过访问变量,将变量记录到控制台。closure.

这应该与第一个代码片段一起工作。

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

}

x()()

另一个更简单的方法是在函数中调用函数。

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

x()
© www.soinside.com 2019 - 2024. All rights reserved.