2013-06-22 64 views
0

我正在用coffeescript編寫一個基本的node.js web服務器。當我寫:coffeescript:在調用之前定義回調

server.listen(3000, listener) 
listener =() -> 
    console.log 'server listening on port 3000' 

它啓動服務器,但不打印消息。所以我認爲回調沒有被調用。另一方面,當我這樣做時:

listener =() -> 
    console.log 'server listening on port 3000' 
server.listen(3000, listener) 

消息打印在控制檯上。

爲什麼回調會在調用之前被定義,而不是如果定義之後呢?

+0

相關:http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function-functionname。 CoffeeScript不會生成命名函數(類之外)。 – zdyn

回答

2

由於方式的CoffeeScript函數定義的工作,你的第一個片段是相當於在JavaScript中是這樣的:

var message; 
console.log(message()); // message is undefined at this point 
message = function() { return "Hello World!"; }; 

message當第一次訪問它不存在,那麼這將引發一個錯誤。這聽起來像你想要的:

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

哪些工作正常,但AFAIK,沒有辦法寫在CoffeeScript中。

+0

是的,我即將鏈接http://stackoverflow.com/a/16549446/1375688,但是,你是對的。 – tldr

+0

'var listener'發生在'server.listen'調用之前,'listener = function(){...}'發生在之後。所以'listener'確實存在(或者JavaScript引擎會給你一個ReferenceError),但它的值是'undefined',所以他們實際上在執行'server.listen(3000,undefined)'。所以你在正確的軌道上,但細節是有點關閉。 –

+0

@ muistooshort偉大的點,編輯。 – zdyn

相關問題