全局对象:
【注意】永远使用var 定义变量以避免引入全局变量,因为全局变量会污染 命名空间,提高代码的耦合风险
一:(事件机制)
1.事件发射器
所有事件的对象都是 events.EventEmitter 的实例(事件发射器)
①var EventEmitter = require('events').EventEmitter;
var event = new EventEmitter();
②var events = require('events');
var event = new events.EventEmitter();
注册接收:event.on(emmiter, cb)为指定事件emmiter注册了一个监听器,接受字符串emmiter和回调函数cb
发送/射:event.emit(emmiter, [arg1], [arg2], [...]) 发射emmiter事件,传递若干可选参数到事件监听器的参数表
移除监听器:event.removeListener(emmiter, cb) 移除指定事件的某个监听器,emmiter必须是该事件已经注册过的监听器.如果指定 event,则移除指定事件的所有监听器
单次监听器:event.once(emmiter, cb)
2.error 事件
遇到异常的时候通常会发射error事件,当error 被发射时,EventEmitter规定如果没有响应的监听器,Node.js 会把它当作异常,退出程序。所以要为发射error事件的对象设置监听器,避免遇到错误后整个程序崩溃。例如:
var events = require('events'); var event = new events.EventEmitter(); event.emit('error');//这里没有响应的监听器,整个程序会崩溃。所以要加监听器
加上后:
var events = require('events'); var event = new events.EventEmitter(); event.on('error',function(){ console.log('程序异常') })//出错后终端打印异常 event.emit('error');
3.继承:事件的监听和发射应该是一个对象的方法
大多数时候我们不会直接使用 EventEmitter,而是在对象中继承它。包括 fs、net、 http 在内的,只要是支持事件响应的核心模块都是 EventEmitter 的子类。
二:(模块系统)
node的模块系统是为了更方便去相互调用js文件
例如:在hello.js文件里
function Hello() { varname; this.setName = function(thyName) { name = thyName}; this.sayHello = function() { console.log('Hello ' + name)}; }; module.exports = Hello;//这时其他文件里,可以直接访问文件,调用方法例在main.js里:
varHello = require('./hello'); hello = new Hello(); hello.setName('BYVoid'); hello.sayHello();直接调用的话:
var Start = require('./event.js')//模块
Start.start();//模块里的某个方法
三(函数)
可以先定义一个函数,然后传递,也可以在传递参数的地方直接定义函数(匿名函数)
函数传递使得HTTP服务器工作:
原来方法:
var http = require("http");
function onRequest(request, response) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}
http.createServer(onRequest).listen(8888);
使用匿名函数:
var http = require("http");
http.createServer(function(request, response) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}).listen(8888);
3.