2014-10-30 55 views
-3

我下面一本書的node.js的代碼,JavaScript的瞭解匿名函數的node.js

var net = require('net'); 
var chatServer = net.createServer(); 
chatServer.on('connection', function(client){ 
    client.write('Hi!\n'); 
    client.write('Bye!\n'); 
    client.end(); 
}); 
chatServer.listen(9000); 

是新的我試圖從取出功能

function(client){ 
    client.write('Hi!\n'); 
    client.write('Bye!\n'); 
    client.end(); 
} 

參數,但它不起作用,因爲「客戶端」沒有在「on」方法之外定義。

我相信我明白這個零件是做什麼的,它是一個作爲參數表傳遞的匿名函數,但我不明白「客戶」在哪裏定義或者爲什麼。我知道「客戶端」就像一個對象,並有方法「寫」和「結束」,但我看不到方法「上」知道它是什麼樣的對象。

我的意思是,如果我改變「客戶端」爲「doh」,代碼仍然有效。 這是node.js的某種魔力,或者我真的不懂JavaScript?

+0

客戶端是您傳遞的匿名函數的調用者傳遞的對象。 – developer82 2014-10-30 12:10:16

+0

所以我需要了解的是「on」方法是如何工作的。謝謝。 – 2014-10-30 12:17:08

回答

0

on知道connection偵聽器將返回一個對象。當您在on函數的第二個參數中添加function(varname)時,偵聽器會將導致的對象傳遞給您定義的函數的參數。

0

on(...)方法在此處適用於對象chatServer上名爲connection的事件。

這意味着它是您的chatServer對象在內部連接過程中會調用您的匿名方法。

但它沒有奏效,因爲「客戶端」未在「on」方法之外定義。

客戶端不是你的函數的名字,它是你的參數。如果沒有名字,你不能調用匿名方法!如果你想給這個方法外化,給她一個名字。

例如通過更換您的suscribtion:

chatServer.on('connection', myFunction}); 

然後給一個名字給你的函數:

function myFunction(client){ 
    ... 
} 

的的ChatServer將內部代碼至極將調用你的函數。參數中給出的變量只是您自己的一個指示,他的名字只能用於您的功能範圍

+0

謝謝你,這就是我試圖做的事情(至少我知道如何定義一個函數)。我的失敗是,一旦我定義了一個函數,我做了'chatServer.on('connection',myFunction(client)});',那沒有奏效。相反,白色'chatServer.on('連接',myFunction});'它的工作原理。 – 2014-10-30 12:26:55