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-blocking
和Goodbye!
之间没有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函数传递。
为要调用的函数提供参数:
- 你可以传递一个匿名函数。
setTimeout(function(){goodbye(name)}, 5000);
- 或者,您可以将参数作为第三个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"); }; }