如何在node.js中执行callback函数?

我刚刚开始学习node.js,并且在express.js网站上的“hello world”示例中出现了一些令我困惑的东西。 在这个例子中,他们引用了callback函数中的服务器variables。

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()在执行callback函数之前是否向服务器variables返回一个值? 它如何做到这一点,它是如何工作的? 节点(和JavaScript)中的所有callback函数都是一样的吗?

我只想简单地解释执行过程。

要清楚,我明白,callback函数有权访问服务器variables。 但是,如果app.listen方法在向服务器variables返回一个值之前执行callback函数,那么当您尝试访问server.adress()时,是不是表示服务器variables仍然未定义? 那是我不明白的。

app.listen()在执行callback函数之前是否向服务器variables返回一个值?

对,就是这样。 app.listen()类似于普通的Node.js server.listen方法 。 callback函数是将侦听器分配给listening事件的快捷方式。

你可以用下面的代码做同样的事情:

 var server = app.listen( 3000 ); server.on( "listening", function () { console.log( "server is listening in port 3000" ); }); 

它如何做到这一点,它是如何工作的? 节点(和JavaScript)中的所有callback函数都是一样的吗?

发生这种情况是因为Node.js中的IO事件全部是asynchronous运行的 ( fs模块有exception), fs ,只有在其他同步代码运行完毕时才会发生。

这在浏览器JS中是一样的 – 如果你同步运行一些JS进程,任何触发的事件(比如clickblur等)只会在完成之后执行。

一个函数可以访问它所创build的范围内的所有variables(除非它掩盖了它们)。

 var in_the_global_scope = 1; function outer() { function inner() { alert(in_the_global_scope); } inner(); } 

inner可以访问任何在innerouter和全局范围inner声明的variables。

作为callback的函数并不真正相关。

listen方法本身具有对server访问权限,因为listen是在不同的范围内创build的。

但是,如果它返回一个值,它怎么能执行callback函数呢?

因为它不只是执行callback。 它等待一个事件,callback被解雇了。

 var timeOutId = setTimeout(function() { alert(timeOutId); }, 1000); 

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()返回的值。

你可以这样想, app.listen()返回一个包含如何运行服务器的信息的对象服务器,例如portaddress ,就像一个指令说明一样。 然后去运行服务器。

当服务器运行时,应用程序还在该指令示例中添加了一些注释,例如,服务器也是调用callback函数app.listen(port[, callback]) 。 有了这个function,我们可以从指令和备注中获取服务器信息。