1.关于es6变量
const 定义常量,不会发生改变的就用这个
let 定义局部变量
如:
const fs=require('fs');//require()表示载入这个模块
function aa(){
for(var i=0;i<10;i++){}
}
这个i变量用var定义,就把i变成全局变量,导致在function aa()这个作用域块被污染了。可以用let定义它,这样不会造成污染,只会在for的作用域里面作用
function aa(){
for(let i=0;i<10;i++){}
}
2.非阻塞I/O(Node核心特性)&事件轮询
Nodejs两个主要特点:单线程、非阻塞。
Node通过事件驱动的方式处理请求时无需为每一个请求创建额外的线程。在事件驱动的模型当中,每一个IO工作被添加到事件队列中,线程循环地处理队列上的工作任务,当执行过程中遇到来堵塞(读取文件、查询数据库)时,线程不会停下来等待结果,而是留下一个处理结果的回调函数,转而继续执行队列中的下一个任务。这个传递到队列中的回调函数在堵塞任务运行结束后才被线程调用。
事件轮询模型
如上图所示,每个异步函数执行结束后,都会在事件队列中追加一个事件(同时保存一些必要参数)。事件轮询下一次循环便可取出事件,然后会调用异步方法对应的回调函数(参数)。这样一来,nodejs便能保证开发者编写的每行代码(每个回调)均在主线程中执行。注意这里有一个问题,如果开发者在回调函数中调用了阻塞方法,那么整个事件轮询就会阻塞,事件队列中的事件得不到及时处理。正因为这样,nodejs中的一些库方法均是异步的,也提倡用户调用异步方法。