1. 控制台
在Node.js中,使用console
对象代表控制台(在操作系统中表现为一个操作系统指定的字符界面,比如 Window中的命令提示窗口)。
- console.log
- console.info
- console.error 重定向到文件
- console.warn
- console.dir
- console.time
- console.timeEnd
- console.trace
- console.assert
2. 全局作用域
- 全局作用域(global)可以定义一些不需要通过任何模块的加载即可使用的变量、函数或类
- 定义全局变量时变量会成为global的属性。
- 永远不要不使用var关键字定义变量,以免污染全局作用域
- setTimeout clearTimeout
- setInterval clearInterval
- unref和ref
let test = function(){
console.log('callback');
}
let timer = setInterval(test,1000);
timer.unref();
setTimeout(function(){
timer.ref();
},3000)
3. 函数
-
require
-
模块加载过程
-
require.resolve
-
模板缓存(require.cache)
-
require.main
-
模块导出
module.exports, require, module, filename, dirname
4. process
4.1 process对象
在node.js里,process 对象代表node.js应用程序,可以获取应用程序的用户,运行环境等各种信息
process.argv.forEach(function(item){
console.log(item);
});
process.on('exit',function(){
console.log('clear');
});
process.on('uncaughtException',function(err){
console.log(err);
})
console.log(process.memoryUsage());
console.log(process.cwd());
console.log(__dirname);
process.chdir('..');
console.log(process.cwd());
console.log(__dirname);
function err(){
throw new Error('报错了');
}
err();
4.2 process.nextTick setImmediate
- process.nextTick()方法将 callback 添加到"next tick 队列"。 一旦当前事件轮询队列的任务全部完成,在next tick队列中的所有callbacks会被依次调用。
- setImmediate预定立即执行的 callback,它是在 I/O 事件的回调之后被触发
setImmediate(function(){
console.log('4');
});
setImmediate(function(){
console.log('5');
});
process.nextTick(function(){
console.log('1');
process.nextTick(function(){
console.log('2');
process.nextTick(function(){
console.log('3');
});
});
});
console.log('next');
5. EventEmitter
在Node.js的用于实现各种事件处理的event模块中,定义了EventEmitter类,所以可能触发事件的对象都是一个继承自EventEmitter类的子类实例对象。
方法 | 描述 |
---|---|
addListener(event, listener) | 对指定事件绑定时间处理函数 |
on(event, listener) | 对指定事件绑定时间处理函数 |
once(event, listener) | 对指定事件指定只执行一次的事件处理函数 |
removeListener(event, listener) | 对指定事件解除事件处理函数 |
removeAllListeners([event]) | 对指定事件解除所有的事件处理函数 |
setMaxListeners(n) | 指定事件处理函数的最大数量 n 为整数值,代表最大的可指定事件处理函数的数量 |
listeners(event) | 获取指定事件的所有事件处理函数 |
emit(event, [arg1], [arg2], [...]) | 手工触发指定事件 |
let EventEmitter = require('./events');
let util = require('util');
util.inherits(Bell,EventEmitter);
function Bell(){
EventEmitter.call(this);
}
let bell = new Bell();
bell.on('newListener',function(type,listener){
console.log(对 $事件增加{type} 事件增加${listener});
});
bell.on('removeListener',function(type,listener){
console.log(对$事件删除{type} 事件删除${listener});
});
function teacherIn(thing){
console.log(老师带${thing}进教室);
}
function studentIn(thing){
console.log(学生带${thing}进教室);
}
function masterIn(thing){
console.log(校长带${thing}进教室);
}
bell.on('响',teacherIn);
bell.on('响',studentIn);
bell.once('响',masterIn);
bell.emit('响','书');
console.log('======');
bell.emit('响','书');
console.log('======');
bell.removeAllListeners('响');
console.log('======');
bell.emit('响','书');
function EventEmitter(){
this.events = {};//会把所有的事件监听函数放在这个对象里保存
//指定给一个事件类型增加的监听函数数量最多有多少个
this._maxListeners = 10;
}
EventEmitter.prototype.setMaxListeners = function(maxListeners){
this._maxListeners = maxListeners;
}
EventEmitter.prototype.listeners = function(event){
return this.events[event];
}
//给指定的事件绑定事件处理函数,1参数是事件类型 2参数是事件监听函数
EventEmitter.prototype.on = EventEmitter.prototype.addListener = function(type,listener){
if(this.events[type]){
this.events[type].push(listener);
if(this.maxListeners!=0this.events[type].lengththis.maxListeners){
console.error(MaxListenersExceededWarning: Possible EventEmitter memory leak detected. ${this.events[type].length} ${type} listeners added. Use emitter.setMaxListeners() to increase limit);
}
}else{
//如果以前没有添加到此事件的监听函数,则赋一个数组
this.events[type] = [listener];
}
}
EventEmitter.prototype.once = function(type,listener){
//用完即焚
let wrapper = (...rest)={
listener.apply(this);//先让原始的监听函数执行
this.removeListener(type,wrapper);
}
this.on(type,wrapper);
}
EventEmitter.prototype.removeListener = function(type,listener){
if(this.events[type]){
this.events[type] = this.events[type].filter(l=l!=listener)
}
}
//移除某个事件的所有监听函数
EventEmitter.prototype.removeAllListeners = function(type){
delete this.events[type];
}
EventEmitter.prototype.emit = function(type,...rest){
this.events[type]this.events[type].forEach(listener=listener.apply(this,rest));
}
module.exports = EventEmitter;
util
var util = require('util');
//util.inherit();
console.log(util.inspect({name:'zxmf'}));
console.log(util.isArray([]));
console.log(util.isRegExp(/\d/));
console.log(util.isDate(new Date()));
console.log(util.isError(new Error));
6. node断点调试
V8 提供了一个强大的调试器,可以通过 TCP 协议从外部访问。Nodejs提供了一个内建调试器来帮助开发者调试应用程序。想要开启调试器我们需要在代码中加入debugger标签,当Nodejs执行到debugger标签时会自动暂停(debugger标签相当于在代码中开启一个断点)。
var a = 'a';
var b = 'b';
debugger;
var all = a + ' ' + b;
console.log(all);
网友评论