1. 控制台 #

在Node.js中,使用console对象代表控制台(在操作系统中表现为一个操作系统指定的字符界面,比如 Window中的命令提示窗口)。

2. 全局作用域 #

let test = function(){
  console.log('callback');
}
let timer = setInterval(test,1000);
timer.unref();
setTimeout(function(){
  timer.ref();
},3000)

3. 函数 #

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 #

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!=0&&this.events[type].length>this._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:'zfpx'}));
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);
命令 用途
c 继续执行到下一个断点处
next,n 单步执行
step,s 单步进入函数
out,o 退出当前函数
setBreakpoint(10),sb(10) 在第10行设置断点
repl 打开求值环境,ctrl_c退回debug模式
watch(exp) 把表达式添加监视列表
watchers 显示所有表达式的值

debugger