[英]setTimeout nuances in Node.js
我试图了解setTimeout函数中回调函数的工作方式。 我知道格式是: setTimeout(callback, delay)
我写了一些测试脚本来探索这一点。
test1.js
console.log("Hello")
setTimeout(function () { console.log("Goodbye!") }, 5000)
console.log("Non-blocking")
这将按预期工作,打印Hello <CRLF> Non-blocking
,然后5秒钟后打印Goodbye!
然后,我想将函数带到setTimeout之外,如下所示:
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)
}
我的问题确实是,尽管setTimeout提供了具有正确语法的有效函数,但在函数中有参数时为什么它不起作用?
通过在函数名称后面加上括号,可以有效地调用它,而不会将函数作为回调传递。
为要调用的函数提供参数:
setTimeout(function(){goodbye(name)}, 5000);
setTimeout(goodbye, 5000, name);
看一下这个问题: 如何将参数传递给setTimeout()回调?
无论放置在何处, goodbye(name)
将立即执行该功能。 因此,您应该将函数本身传递给setTimeout()
: setTimeout(goodbye, 5000, name)
。
当您像这样使用它时:
setTimeout(goodbye(), 5000);
它将首先调用goodbye
以获得其返回值,然后将使用返回的值调用setTimeout
。
您应该使用对回调函数的引用来调用setTimeout
,即仅指定函数的名称,以便获得其引用而不是调用它:
setTimeout(goodbye, 5000);
要在向回调函数发送参数时引用函数,可以将其包装在函数表达式中:
setTimeout(function() { goodbye(name); }, 5000);
您可以在调用中使用括号,但是该函数应返回对实际回调函数的函数引用:
setTimeout(createCallback(), 5000);
function createCallback() {
return function() {
console.log("Goodbye");
};
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.