Node.js中的setTimeout细微差别

我想了解如何callback函数在setTimeout函数内工作。 我知道的格式是: setTimeout(callback, delay)我写了一个小testing脚本来探讨这一点。

test1.js

 console.log("Hello") setTimeout(function () { console.log("Goodbye!") }, 5000) console.log("Non-blocking") 

这个按预期工作,打印Hello <CRLF> Non-blocking ,然后5秒钟后打印Goodbye!

然后我想这样的setTimeout之外的function:

 console.log("Hello") setTimeout(goodbye(), 5000) console.log("Non-blocking") function goodbye () { console.log("Goodbye") } 

但它不起作用, Non-blockingGoodbye!之间没有5秒的延迟Goodbye! ,他们一个接一个的打印。

它工作,如果我从超时的函数调用中删除方括号,如下所示:

 setTimeout(goodbye, 5000) 

但这对我来说没有意义,因为这不是你如何调用一个函数。 此外,如果它看起来像这样,你将如何传递参数给函数?

 var name = "Adam" console.log("Hello") setTimeout(goodbye(name), 5000) console.log("Non-blocking") function goodbye (name) { console.log("Goodbye "+name) } 

我的问题是,当函数中有参数时,为什么它不工作,尽pipe事实上setTimeout是用正确的语法提供了一个有效的函数?

通过将括号放在函数名称后面,可以有效地调用它,而不是将函数作为callback函数传递。

为要调用的函数提供参数:

  1. 你可以传递一个匿名函数。 setTimeout(function(){goodbye(name)}, 5000);
  2. 或者,您可以将参数作为第三个parameter passing。 setTimeout(goodbye, 5000, name);

看看这个问题: 我怎样才能传递一个参数给setTimeout()callback?

不pipe你放在哪里, goodbye(name) 马上执行该function。 所以你应该把函数本身传递给setTimeout()setTimeout(goodbye, 5000, name)

当你像这样使用它:

 setTimeout(goodbye(), 5000); 

它将首先呼叫goodbye以获得它的返回值,然后使用返回值调用setTimeout

您应该使用对callback函数的引用来调用setTimeout ,即只指定函数的名称,以便获取其引用而不是调用它:

 setTimeout(goodbye, 5000); 

如果要将参数发送到callback函数,可以将函数引用到函数expression式中:

 setTimeout(function() { goodbye(name); }, 5000); 

可以在调用中使用parantheses,但是函数应该返回一个实际的callback函数的函数引用:

 setTimeout(createCallback(), 5000); function createCallback() { return function() { console.log("Goodbye"); }; }