Javascript 为什么将变量设置为setTimeout函数会立即运行它?

Javascript 为什么将变量设置为setTimeout函数会立即运行它?,javascript,Javascript,我有以下代码 setTimeout(function() { alert('Hello, Mr. Universe!'); }, 2000) 这将立即运行,并根据堆栈在2秒(至少)后输出警报。 但我想知道为什么下面的行为也是这样 let myGreeting = setTimeout(function() { alert('Hello, Mr. Universe!'); }, 2000) 这不是一个函数表达式吗?为什么它在没有调用的情况下运行,例如myGree

我有以下代码

  setTimeout(function() {
    alert('Hello, Mr. Universe!');
  }, 2000)
这将立即运行,并根据堆栈在2秒(至少)后输出警报。 但我想知道为什么下面的行为也是这样

  let myGreeting = setTimeout(function() {
    alert('Hello, Mr. Universe!');
  }, 2000)

这不是一个函数表达式吗?为什么它在没有调用的情况下运行,例如myGreeting()?

返回一个要与之一起使用的id。在第一个示例中,您只是忽略了返回值,因此结果应该不会有差异。

要通过调用函数来启动超时,请在函数体中执行setTimeout,而不是分配它

// not const myGreeting = setTimeout, but...
const myGreeting = () => {
  return setTimeout(() => {
    alert('Hello, Mr. Universe!');
  }, 2000);
}

// call it
const timeoutId = myGreeting() // after 2 seconds, 'Hello..."

您似乎对
let
的语义感到困惑。此处等号的右侧表达式在赋值时仍在求值。您不是将
myGreeting
设置为某个表达式。您是将
myGreeting
设置为对某个表达式求值的结果。

???好的,让我们看看setTimeout中的内容
setTimeout()
您正在调用它,这就是它运行的原因

等待,但是当我将变量myGreeting分配给setTimeout时,为什么即使我没有调用它,它也会运行?@ILikeThePoopSmith您正在将变量
myGreeting
设置为
setTimeout
的返回值,这是一个超时id。您正在调用
setTimeout
函数不管怎样。为什么即使我没有调用它,它也会运行?您显然正在调用
setTimeout
,并将它返回的内容分配给
myGreeting
。明白了,有什么理由这样做吗?@ILikeThePoopSmith,在OP中对它进行编码将立即启动超时,并给您id以清除它。函数我建议做同样的事情,但只有在你调用它之后才启动。我仍然不明白为什么OP版本的MyGeLead立即执行。是因为它必须执行来解决任务吗?是的,@ ILikeThePoopSmith,确切地。考虑<代码>让num =数学。ABS(-3)< /代码>。在执行该语句之后,Num将是什么?