全局变量
来自于http://nodejs.cn/api/globals.html的解读。
在node中,很多看着像全局变量的变量,实际只是模块内的变量,如__dirname.__filename,module,require,exports.,
下面就先说说这几个:
__dirname:
当前模块的目录名,__dirname=path.__dirname(__filename);
__filename:
当前的文件名,是一个绝对路径,/a/b/c/d.js
exports:
注意它与module.exports的区别,export只在模块内有效。
module:
实现当前模块的引用,module.exports导出指定的内容,通过require访问内容。
require:
实现对本地模块,json文件,node_module的引用,
下面就是node真正的全局变量,使用时无需require引入:
buffer:是一个类似于整数数组的实例,它是保存在V8堆外物理内存里,大小在定义时就是固定的,无法改变,是为了弥补js不能处理二进制流而生。
在存入或取出字符串时,需要指定字符编码(ascii,utf8,utf16le,ucs2,base64,latin1,binary,hex)
new Buffer()创建的方式已被废弃,目的是为了创建的实例更可靠,建议采用:Buffer.alloc(),Buffer.from(),Buffer.allocUnsafe().
其中Buffer.allocUnsafe()虽然创建会比Buffer.alloc()更快,但是它可能包含旧数据,造成不安全因素,需要fill或者write去填充未初始化的数据。
可以使用for ...of..进行迭代。
const buf = Buffer.from([1, 2, 3]); // 输出: // 1 // 2 // 3 for (const b of buf) { console.log(b); }
还可以buf.values() ,或者buf.keys,buf.enties()创建迭代器。
setImmediate():只存在node中
process.nextTick(),效率最高,消费资源小,但会阻塞CPU的后续调用;
setTimeout(),精确度不高,可能有延迟执行的情况发生,且因为动用了红黑树,所以消耗资源大;
setImmediate(),消耗的资源小,也不会造成阻塞,但效率也是最低的。
setTimeout采用的是类似IO观察者,setImmediate采用的是check观察者,而process.nextTick()采用的是idle观察者。
三种观察者的优先级顺序是:idle观察者>>io观察者>check观察者
setInterval():
当 delay 大于 2147483647 或小于 1 时,delay 会被设为 1。其他几个的延迟时间也是一样。
setTimeout():
应该注意的点是,此方法具有可用util.promisify()提供的promises常用变体
const util = require('util');
const setTimeoutPromise = util.promisify(setTimeout);
setTimeoutPromise(40, 'foobar').then((value) => { // value === 'foobar' (passing values is optional) // This is executed after about 40 milliseconds. });
与以上对应还有几个取消相应定时器的方法。
global:
在浏览器中,顶层作用域就是全局作用域。 这意味着在浏览器中,var something 会定义一个新的全局变量。 在 Node.js 中则不同,顶层作用域不是全局作用域,var something 的作用域只在模块内。
process:提供node进程的有关信息以及控制进程
此对象涉及内容较多,需在process中单独讨论