【问题标题】:JavaScript Function Syntax + setTimeout() 'ERR_INVALID_CALLBACK: Callback must be a function. Received undefined [duplicate]JavaScript 函数语法 + setTimeout() 'ERR_INVALID_CALLBACK:回调必须是函数。收到未定义的[重复]
【发布时间】:2021-05-06 05:24:04
【问题描述】:
const sayHello = function () {
  console.log("hello");
};

sayHello;
sayHello();

setTimeout(sayHello, 1000);
setTimeout(sayHello(), 1000);

我有点困惑为什么第 5 行“什么都不做”但也没有抛出错误,而第 8 行按预期运行但第 9 行抛出无效回调错误。我正在运行的这段代码是 Visual Studio Code,如果它有所作为的话。

【问题讨论】:

  • 好的,所以setTimeout 的工作原理是它接受(Function, Number) 之类的参数,并在达到时间数时尝试执行该函数。问题是sayHello 是一个函数,而sayHello() 是未定义的。这是因为sayHello() 是函数的执行形式,因此它等于它返回的内容,在你的情况下,NOTHING
  • sayHello; 什么都不做,因为它是对函数的引用。另一方面,sayHello(); 调用该函数(记录“hello”)。但是,当使用 setTimeout 时,您应该将一个函数作为第一个参数传递,这是您第一次做的。第二次,您立即调用该函数并将返回值传递给 setTimeout,但是由于该函数不返回任何内容,因此最后一行等效于 setTimout(undefined, 1000),因此出现错误。
  • 要真正了解正在发生的事情,重要的是要了解当遇到像setTimeout(sayHello(), 1000); 这样的行时,除了sayHello() 之外的所有内容都将被完全忽略,直到函数调用被解决。为了更好地了解事情发生的顺序和发生方式,请尝试运行此行(在浏览器中):alert(prompt("enter your name:") + " is " + prompt("enter your age:") + " years old")

标签: javascript settimeout


【解决方案1】:

当您在函数名称后使用() 时,您正在执行该函数。但是没有它,您将引用该函数。这就是为什么第 5 行不做任何事情的原因。该函数没有被执行。但另一方面,第 6 行正在执行该函数,该函数应将“hello”打印到控制台。

setTimeout 需要一个函数引用(回调函数),让它知道在 1000 毫秒过去后要执行什么。

所以输入setTimeout(sayHello(), 1000) 会直接执行sayHello 函数,而不是作为回调提供它。所以这不会像你想要的那样工作。

键入setTimeout(sayHello, 1000),您改为提供函数引用,setTimeout 将知道在 1000 毫秒过去后要执行的函数。这是正确的做法。

【讨论】:

  • 非常感谢!
  • @Lolitarox33 如果这回答了您的问题,那么请将其标记为已接受的答案,让其他人知道您找到了解决方案。
猜你喜欢
  • 1970-01-01
  • 2021-03-10
  • 2018-10-30
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-16
相关资源
最近更新 更多