一、全局对象和全局变量
全局对象:global
global最根本的左营是作为全局变量的宿主。按照ECMAScript的定义,
满足以下条件的变量是全局变量。
1、在最外层定义的变量
2、全局对象的属性
3、隐式定义的变量(未定义直接赋值的变量)
当你定义一个全局变量时,这个变量同时也会成为全局对象的属性,反之亦然。
需要注意的是,在node中你不可能在最外层定义变量,因为所有用户代码都是
属于当前模块的,而模块本事不是最外层的上下文。
注意:
永远使用var定义变量以避免引入全局变量,因为全局变量会污染命名空间,提高代码的耦合风险。
全局变量process 描述当前进程状态,提供一个与操作系统的简单接口。
process.argv是命令行参数数组,第一个元素是node,第二个元素是脚本文件名
从第三个元素开始每个元素是一个运行参数。
执行结果
提供标准输入输出流。
执行结果
process.nextTick(callback)的功能是为事件循环设置一项任务,
node会在下次事件循环调用响应的时候调用callbackwhy?
node适合I/O密集型的应用,而不是计算密集型的应用,
因为一个你的进程只有一个线程
因此在任何时刻都只有一个事件在执行,如果这个事件占用大量的cpu时间,
执行时间循环中的下一个时间就需要等待很久,因此node的一个编程原则
就是尽量缩短每个事件的执行时间,process.nextTick()提供了一个这样的
工具,可以把复杂的工作拆散,变成一个个较小的事件。
执行结果很显然不是同步执行调用的
是在下一个事件循环响应时调用的
console也是全局变量 用于提供控制台标准输出的。
console.log()向标准输出流打印字符并以换行符结束。。console.log 接受若干
个参数,如果只有一个参数,则输出这个参数的字符串形式。如果有多个参数,则
以类似于 C 语言 printf() 命令的格式输出。第一个参数是一个字符串,如果没有
参数,只打印一个换行。
运行结果为:
console.error()与console.log()用法相同,只是向标准错误流输出。
console.trace():向标准错误流输出当前的调用栈
二、常用工具util
util是一个核心模块,提供常用函数的集合,用于弥补核心Javascript的功能过于精简的不足。
1、对象继承
util.inherits(son,//util.inherits(constructor,superconstructor);
测试结果
Son仅仅使用util中的函数就完成了从圆原型集成属性和方法。
2、将任意对象转换为字符串util.inspect()
结果为
3、其他
还有四个类型测试工具以及格式化和debug工具
util.isArray();判断是不是数组
util.isRegExp();判断正则
util.isDate();判断时间
util.isError();判断是否是错误
结果
util.format();
结果
三、事件处理
1、普通事件处理 绑定 移除等
events模块中的events.EventEmitter是时事件发射和事件监听器功能的封装。
带参数的事件。
结果
EventEmitter.once()只绑定执行一次,注册单次监听器,最多触发一次
结果
移除事件监听EventEmitter.removeListener(event,listener);移除指定事件的某个监听器
其中listener必须是该时间已经注册过的监听器
正常情况下这么写
结果是
如果加上移除事件监听的代码。
结果是
没有ok5事件执行的消息。说明注册的监听器已经成功移除了。
如果绑定了多个监听器想同时移除的话 使用
EventEmitter.removeAllListeners([event]);
结果
显示一个事件都没有执行,说明删除了所有的监听器。
2、error事件
Eventemitter定义了一个特殊事件 error
当error事件发射的时候,如果没有响应的监听器 node会把它当做一场,
退出程序并打印调用栈,一般要为会发射error事件的对象设置监听器,避免
遇到错误后整个程序崩溃掉。
结果
如果添加处理函数。
结果
大多数时候我们不会直接使用EventEmitter,而是在对象中继承它,包括fs、net、http在内的
只要是支持事件响应的核心模块都是EventEmitter的子类。
why?
首先,具有某个实体功能的对象实现事件符合语义,事件的监听和发射应该是一个对象的方法。
其次,Javascript的对象机制是基于原型的,支持部分多重继承,继承Eventemitter不会打乱
对象原有的继承关系。
四、文件系统fs(file system)
fs模块是文件操作的封装,它提供了文件的读取、写入、更名、删除、遍历目录、链接等POSIX
文件系统的操作。
不同之处:
fs模块中所有操作都是提供了异步和同步的两个版本,例如读取文件内容的函数有异步的
fs.readFile()h和同步的fs.readFileSync()。
1、异步读取文件 fs.readFile(文件名,编码,回调函数(error,data))
最简单的读取文件的函数。
文件名:必填
编码:表示文件的字符编码,指定了解析后是字符串,否则将会以Buffer形式表示二进制数据
回调函数:error表示有没有错误发生,data是读取到的文件内容
结果是
2、同步读取文件:
结果
同步读文件如果出现异常需要try catch捕获异常
结果
3、文件打开fs.open(文件名,打开模式,权限,回调)
fs.open(path, flags, [mode], [callback(err, fd)])是 POSIX open 函数的
封装,与 C 语言标准库中的 fopen 函数类似。它接受两个必选参数,path 为文件的路径,
flags 可以是以下值。
r :以读取模式打开文件。
r+ :以读写模式打开文件。
w :以写入模式打开文件,如果文件不存在则创建。
w+ :以读写模式打开文件,如果文件不存在则创建。
a :以追加模式打开文件,如果文件不存在则创建。
a+ :以读取追加模式打开文件,如果文件不存在则创建。
mode 参数用于创建文件时给文件指定权限,默认是 0666
①。回调函数将会传递一个文
件描述符 fd
4、文件读取
fs.read(fd, buffer, offset, length, position, [callback(err, bytesRead,
buffer)])是 POSIX read 函数的封装, 相比 fs.readFile 提供了更底层的接口。 fs.read
的功能是从指定的文件描述符 fd 中读取数据并写入 buffer 指向的缓冲区对象。 offset 是
buffer 的写入偏移量。length 是要从文件中读取的字节数。position 是文件读取的起始
位置,如果 position 的值为 null,则会从当前文件指针的位置读取。回调函数传递
bytesRead 和 buffer,分别表示读取的字节数和缓冲区对象。
以下是一个使用 fs.open 和 fs.read 的示例。
var fs = require('fs');
fs.open('content.txt', 'r', function(err, fd) {
if (err) {
console.error(err);
return;
}
var buf = new Buffer(8);
fs.read(fd, buf, 0, 8, null, function(err, bytesRead, buffer) {
if (err) {
console.error(err);
return;
}
console.log('bytesRead: ' + bytesRead);
console.log(buffer);
})
});
运行结果则是:
bytesRead: 8
<Buffer 54 65 78 74 20 e6 96 87>
一般来说,除非必要,否则不要使用这种方式读取文件,因为它要求你手动管理缓冲区
和文件指针,尤其是在你不知道文件大小的时候,这将会是一件很麻烦的事情。
5、http服务器
http.createServer 创建了一个 http.Server 的实例,将一个函数
作为 HTTP 请求处理函数。这个函数接受两个参数,分别是请求对象( req )和响应对象
( res ) 。在函数体内,res 显式地写回了响应代码 200 (表示请求成功) ,指定响应头为
'Content-Type': 'text/html',然后写入响应体 '<h1>Node.js</h1>',通过 res.end
结束并发送。最后该实例还调用了 listen 函数,启动服务器并监听 3000 端口
GET POST