Node.js coffeescript:在回调之前定义回调';重新命名

Node.js coffeescript:在回调之前定义回调';重新命名,node.js,callback,coffeescript,Node.js,Callback,Coffeescript,我正在用coffeescript编写一个基本node.js web服务器。当我写作时: server.listen(3000, listener) listener = () -> console.log 'server listening on port 3000' 它启动服务器,但不打印消息。所以我推测回调没有被调用。另一方面,当我这样做时: listener = () -> console.log 'server listening on port 3000' ser

我正在用coffeescript编写一个基本node.js web服务器。当我写作时:

server.listen(3000, listener)
listener = () ->
  console.log 'server listening on port 3000'
它启动服务器,但不打印消息。所以我推测回调没有被调用。另一方面,当我这样做时:

listener = () ->
  console.log 'server listening on port 3000'
server.listen(3000, listener)
消息打印在控制台上


如果回调是在调用之前定义的,为什么会被调用,而如果回调是在调用之后定义的,为什么不会被调用?

由于CoffeeScript函数定义的工作方式,您的第一个代码片段相当于JavaScript中的以下内容:

var message;
console.log(message()); // message is undefined at this point
message = function() { return "Hello World!"; };
消息在首次访问时不存在,因此会引发错误。听起来你想要:

console.log(message());
function message() { return "Hello World!"; }

这很好,但是,好吧,没有办法在CoffeeScript中写出来。

Related:。CoffeeScript不生成命名函数(类外)。是的,我正要链接,但你是对的。
var侦听器发生在
服务器之前。listen
调用和
listener=function(){…}
发生在之后。因此,
listener
确实存在(或者JavaScript引擎会给你一个ReferenceError),但是它的值是
undefined
,所以他们实际上在做
server.listen(3000,undefined)
。所以你的思路是对的,但是细节有点偏离了。