REPL环境(交互式解释器(node环境))、全局对象、nodejs函数、方法、事件处理模块、事件驱动

189 阅读5分钟
NodejsREPL环境:表示一个电脑的环境,可以在终端输入命令并接收系统的响应
Nodejs自带交互解释器
    读取:读取用户输入,解释输入了javascript数据结构并存储在内存中
    执行:执行输入的数据结构
    打印:输出结果
进入REPL:
    可以在命令提示符面板输入$node(window系统不需要,mac系统需要)
    
REPL命令:
    ctrl+c:退出当前终端
    ctrl+c按两次:退出Node REPL环境
    ctrl+d:退出REPL
    上下键:查看历史命令
    .clear:退出多行表达式
    .save filename:保存当前的Node REPL会话到指定文件
    .load filename:载入当前Node REPL会话的文件内容
    tab:列出当前命令
    .help:列出使用命令

node测试或者运行js文件,使用console面板(console面板与之前是一样的)
window命令 
    mkdir 名称:新建文件夹
    cd 名称:进入文件夹
-   关机:`shutdown /s`
-   重启:`shutdown /r`
-   注销:`shutdown /l`
-   休眠:`shutdown /h /f`
-   取消关机:`shutdown /a`
-   定时关机:`shutdown /s /t 3600`3600 秒后关机)
-   切换磁盘:`d:`(进入 d 盘)
-   切换磁盘和目录:`cd /d d:/test`(进入 d 盘 test 文件夹)
-   进入文件夹:`cd \test1\test2`(进入 test2 文件夹)
-   返回根目录:"cd\""
-   回到上级目录:`cd ..`
-   新建文件夹:`md test`
-   显示目录中文件列表:`dir`
-   显示目录结构:`tree d:\test`(d 盘 test 目录)
-   显示当前目录位置:`cd`
-   显示指定磁盘的当前目录位置:`cd d:`
    删除文件夹:rd
    
全局对象:
    在nodejs中,在一个模块中定义的变量,函数或方法只能在该模块中可用,但可以通过exports对象的使用将其传递到
模块外部
    javascript中有一个特殊的对象,成为全局对象,他及其所在的属性都可以在程序的任何地方访问,即全局变量
    在浏览器javascript中,通常window是全局对象,而nodejs中的全局对象是global,所有全局变量都是global对象
的属性
    在nodejs我们可以直接访问到glodal的属性,而不需要在应用中包含他,glodal对象代表nodejs中的全局变量、函数
或对象都是该对象的一个属性值

全局对象和全局变量
    glodal最根本的作用是作为全局变量的宿主。按照ECMAScript的定义,满足以下条件的变量是全局变量
        在最外层定义的变量
        全局对象的属性
        隐式定义的变量
    当你定义一个全局变量时,这个变量同时也会作为全局对象的属性,反之亦然,需要注意的是,在nodejs中你不可以
在最外层定义变量,因为所有用户代码都是属于当前模块的,而模块本身不是最外层上下文
    永远使用var定义变量以避免引入全局变量,因为全局变量会污染命名空间,提高代码耦合风险
    全局变量避免使用var定义,避免引入全局变量

全局变量__filename变量(下划线两个)
    __filename:表示当前正在执行的文件脚本文件名
全局变量__dirname变量
    __dirname表示当前执行脚本所在的目录
    
settimeout全局函数,与js中的settimeout作用类似:在控制台去回调一个函数,但只执行一次
require():可以使用require函数来加载模块
require.resolve函数:查询某个模块文件的带有完整性的绝对路径文件名
require.cache:该对象表示缓存了所有已被加载的模块

EventEmitter
    在node中,用于实现各种事件处理的event模块中,EventEmitter类,所有可能触发的事件的对象都是继承了EventEmitter类的子类的实例对象
    emitter.addListener(event,listener)为指定事件添加一个监听器到监听器数组的尾部
    emitter.on(event,listener)注册一个事件
    emitter.once(event,listener)注册一个一次性事件,触发后就会被抹掉
    emitter.removeListener(event,listener)在时间队列中剔除某一个事件
    emitter.removeAllListeners([event])删除整个事件队列,或多个事件
    
nodejs事件循环:
    nodejs是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高
    nodejs的每一个API都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发
    nidejs基本上所有的事件机制都是用设计模式中观察者模式实现的
    nodejs单线程类似进入一个while的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,
如果有事件发生就调用该回调函数
   
事件驱动
    nodejs使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理然后去服务下一个web请求
    当这个请求完成,他被放回处理队列,当到达队列开头,这个结果被返回给用户
    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作(这也被称之为非阻塞式IO或者事件驱动IO)
    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数
    
虽然node是单线程语言,但是通过事件轮循机制实现多并发

模块:
    nodejs中都是以模块单位划分所有功能,一个nodejs应用程序由大量的模块组成,没一个模块都是一个js脚本
    nodejs可以自己编写代码或者从网上下载以下几种模块
        后缀为.js的javascript文件
        后缀为.node的经过编译后的二进制模块文件
        后缀为json的文件
        加载模块需要完整路径,可以使用./代表当前路径