节点JSvariables作用域

我有下一段代码

function Server() { function eventHandler(data) { console.log('DATA ' + this.server.socket.remoteAddress + ': ' + data); socket.write('You said "' + data + '"'); } function connectionHandler(socket) { console.log('server connected'); console.log('CONNECTED: ' + socket.remoteAddress +':'+ socket.remotePort); socket.on('data', eventHandler); } this.server = net.createServer(connectionHandler); this.port = undefined; this.startServer = function(port) { //Maybe change backlog for security reasons this.port = port; this.server.listen(port, function() { //'listening' listener add handle object here console.log('server bound');}); } } 

每次连接,我得到

 server bound server connected CONNECTED: 132.65.16.64:55028 /a/fr-05/vol/netforce/stud/yotamoo/ex4/myHTTP.js:7 console.log('DATA ' + this.server.socket.remoteAddress + ': ' + data); ^ TypeError: Cannot read property 'remoteAddress' of undefined at Socket.eventHandler (/a/fr-05/vol/netforce/stud/yotamoo/ex4/myHTTP.js:7:43) at Socket.emit (events.js:67:17) at TCP.onread (net.js:329:14) 

这和evenHandler()当然有关系。 我不明白如何在Node JS中创build对象及其范围。 例如,在哪里创buildsocketdata ? 他们的范围是什么?

非常感谢

这意味着当前的调用function。

在你的情况下,这是指eventHandler和eventHandler只有数据作为可访问的值。

如果你尝试访问套接字,你会得到一个像你这样的exception。因为套接字不在该函数范围内。

套接字和数据都来自asynchronouscallback,这是node.js的主要模式。

你必须bind this你想让事件处理函数使用的值,像这样:

 function Server() { function eventHandler(data) { console.log('DATA ' + this.server.socket.remoteAddress + ': ' + data); socket.write('You said "' + data + '"'); } function connectionHandler(socket) { console.log('server connected'); console.log('CONNECTED: ' + socket.remoteAddress +':'+ socket.remotePort); socket.on('data', eventHandler.bind(this)); } this.server = net.createServer(connectionHandler.bind(this)); this.port = undefined; this.startServer = function(port) { this.port = port; this.server.listen(port, function() { console.log('server bound');}); }; }