一 什么是NodeJs
Node.js就是运行在服务端的JavaScript。Node.js是一个基于Chrome JavaScript运行时建立的一个平台。Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行JavaScript的速度非常快,性能非常好。
二 创建node.js应用
第一步:引入required模块
第二步:创建服务器
三 NodeJs回调函数
Node.js异步编程的直接体现就是回调,异步编程依托于回调来实现,但不能说使用了回调程序就异步化了。回调函数在完成任务后就会被调用,Node使用了大量的回调函数,Node所有API都支持回调函数。
四 事件循环
Node.js是单进程单线程应用程序,但是通过事件和回调支持并发,性能非常高。
Node.js的每一个API都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。
Node.js基本上所有的事件机制都是设计模式中观察者模式实现。
Node.js单线程类似进入一个while的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数。
五 Node.js EventEmitter
EventEmitter提供了多个属性,如on和emit,on函数用于绑定事件函数,emit属性用于触发一个事件。
比如:
addListener(event,listener)[为指定事件添加一个监听器到监听器数组的尾部]
on(event,listener)[为指定事件注册一个监听器,接受一个字符串event和一个回调函数]
once(event,listener)[为指定事件注册一个单次监听器,即监听器最多只会触发一次,触发后立刻解除该监听器]
removeListener(event,listener)[移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器]
removeAllListener([event])[移除所有事件的所有监听器,如果指定事件,则移除指定事件的所有监听器]
setMaxListeners(n)[默认情况下,EventEmitters如果你添加的监听器超过10个就会输出警告信息。setMaxListeners函数用于提高监听器的默认限制的数量]
listeners(event)[返回指定事件的监听器数组]
emit(event,[arg1],[arg2],[...])[按参数的顺序执行每个监听器,如果事件有注册监听返回true,否则返回false]
error事件
EventEmitter定义了一个特殊的事件error,它包含了错误的语义,我们在遇到异常的时候通常会触发error事件。当error被触发时,EventEmitter规定如果没有响应的监听器,Node.js会把它当做异常,退出程序并输出错误信息。我们一般要为触发error事件的对象设置监听器,避免遇到错误后整个程序崩溃。
六 Node.js模块系统
模块是Node.js应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个Node.js文件就是一个模块,这个文件可能是JavaScript代码、JSON或者编译过的C/C++扩展。
Node.js提供了exports和require两个对象,其中exports是模块公开的接口,require用于从外部获取一个模块的接口,即所获取模块的exports对象。
七 Node.js函数
在JavaScript中,一个函数可以作为另一个函数接收一个参数。我们可以先定义一个函数,然后传递,也可以在传递参数的地方直接定义函数。
比如:
function say(word){
console.log(word);
}
function execute(someFunction,value){
someFunction(value);
}
execute(say,"hello");
在以上代码中,我们把say函数作为execute函数的第一个变量进行了传递。这里返回的不是say的返回值,而是say本身!这样一来,say就变成了execute中本地变量someFunction,execute可以调用someFunction来使用函数。当然,因为say有一个变量,execute在调用someFunction时可以传递这样一个变量。
匿名函数
我们可以把一个函数作为变量传递,但是我们不一定要绕这个“先定义,再传递”的圈子,我们可以直接在另一个函数的括号中定义和传递这个函数。
function execute(someFunction,value){
someFunction(value);
}
execute(function(word){
console.log(word)
},"Hello");
我们在execute接受第一个参数的地方直接定义了我们准备传递给execute的函数。用这种方式,我们甚至不用给这个函数起名字,这也是为什么它被叫做匿名函数。