今天尝试写node代码了,碰到了一个问题。感觉一些原理还没有掌握。请帮忙解答,并多少阐述些出现此种问题的原理仅仅是简单示例:(时间关系,代码细节错误和事件继承的代码不写了,抓主要问题) //文件server.js var connect = require(‘./connect.js’); var http = require(‘http’);
function Server(){ this.httpServer = new http.server(); this.socket = 0 ; }
Server.prototype.createServer(){ this.httpServer.on('upgrade",function(req,socket,upgradeHead){ this.socket = socket ; var connect = new connect(this.socket); }) }
//文件connect.js
fucntion connect(sock){ this.socket = sock ; this.isLogin = false ; this.init(); }
connect.prototype.init(){ /*问题出现在下面这个函数!!我想绑定这个on data,在回调函数中 我可不可以用this.isLogin,如 果不行为什么 ,如果行,为什么,怎样解决这样的问题,如果回调的function中只有this,代表谁?谢谢 */
this.socket.on('data’,function(data){ if(this.isLogin == false) { checkLogin(data); } else { dispatch(data); } }) }
在回调时,this应该指向了socket对象,socket应该是EventEmitter子类的一个对象,在EventEmitter.prototype.emit方法中,有这样一段代码: var handler = this._events[type]; if (!handler) return false;
if (typeof handler == ‘function’) { switch (arguments.length) { // fast cases case 1: handler.call(this); break; case 2: handler.call(this, arguments[1]); break; case 3: handler.call(this, arguments[1], arguments[2]); break; // slower default: var l = arguments.length; var args = new Array(l - 1); for (var i = 1; i < l; i++) args[i - 1] = arguments[i]; handler.apply(this, args); } return true;
} else if (isArray(handler)) { var l = arguments.length; var args = new Array(l - 1); for (var i = 1; i < l; i++) args[i - 1] = arguments[i];
var listeners = handler.slice();
for (var i = 0, l = listeners.length; i < l; i++) {
listeners[i].apply(this, args);
}
return true;
} else { return false; } 代码中的type便是楼主程序中的data事件,handler就是楼主写的回调函数,在回调函数执行时,是这样调用的handler.apply(this,…),this便是EventEmitter的一个对象,也可是其子类的一个对象,但在这里,this便是楼主的socket对象,因此回调函数中的this便是socket对象。
仅仅是个人理解,理解错了,请指正,欢迎高手们指正错误。