我刚刚开始学习node.js并表达了一些让我在express.js网站上的“hello world”示例中有些困惑的东西。在示例中,它们引用回调函数内的服务器变量。
var server = app.listen(3000, function () {
var host = server.address().address;
var port = server.address().port;
console.log('App listening at http://%s:%s', host, port);
});
app.listen()
在执行回调函数之前是否将值返回给服务器变量?它怎么能这样做,它是如何工作的?对于节点(和javascript)中的所有回调函数,它是否相同?
我只想简单解释一下执行过程。
要清楚,我知道回调函数可以访问服务器变量。但是,如果 app.listen 方法在将值返回到 server 变量之前执行回调函数,那么这并不意味着服务器当您尝试访问 server.adress()时,变量仍然未定义?这是我不明白的。
答案 0 :(得分:2)
app.listen()在执行回调函数之前是否将值返回给服务器变量?
是的,确切地说。 app.listen()
类似于plain Node.js server.listen
method。
回调是将服务器分配给listening
事件的快捷方式的快捷方式。
您可以使用以下代码执行相同的操作:
var server = app.listen( 3000 );
server.on( "listening", function () {
console.log( "server is listening in port 3000" );
});
它如何做到这一点以及它如何运作?对于节点(和javascript)中的所有回调函数,它是否相同?
这是因为IO events in Node.js are all run asynchronously(来自fs
module的例外) - 也就是说,它们只会在其他同步代码运行完毕时发生。
这在浏览器JS中也是如此 - 如果你同步运行一些JS进程,任何触发的事件(如click
,blur
等)只会在完成后执行。
答案 1 :(得分:1)
一个函数可以访问创建的范围内存在的所有变量(除非它掩盖了它们)。
var in_the_global_scope = 1;
function outer() {
function inner() {
alert(in_the_global_scope);
}
inner();
}
inner
可以访问inner
,outer
和全局范围内声明的任何变量。
作为回调的功能并不是真正相关的。
listen
方法本身不有权访问server
,因为listen
是在不同的范围内创建的。
但是如果它返回一个值,那么它怎么能执行回调函数呢?
因为它不只是执行回调。它会等待一个事件,并且回调会因此而被触发。
var timeOutId = setTimeout(function() {
alert(timeOutId);
}, 1000);

答案 2 :(得分:0)
将var服务器分配给函数app.listen()
如果您查看明确的文档,请说明
app.listen()方法是以下的便捷方法(仅限HTTP):
app.listen = function() {
var server = http.createServer(this);
return server.listen.apply(server, arguments);
};
通过设置var server = app.listen()以及app.listen()返回某些内容的事实,您实际上将var服务器设置为app.listen()返回的任何内容。
答案 3 :(得分:0)
您可以这样想,app.listen()
返回一个对象server
,其中包含有关如何运行服务器的信息,例如port
,address
,就像一篇论文说明。然后它去运行服务器。
运行服务器时,应用程序还会在该说明示例porcessid
上添加一些注释
然后服务器也调用回调函数app.listen(port[, callback])
。通过该功能,我们可以从指令和备注中访问服务器信息。