概要:本篇博客主要介绍了node.js中的全局对象。
在JavaScript中,通常window是全局对象,而node.js中的全局对象是global,所有全局变量(除了global本身之外)都是global对象的属性。如:console、process。
1.全局对象与全局变量
global最根本的作用是作为全局变量的宿主。满足以下条件:
●在最外层定义的变量;
● 全局对象的属性;
● 隐式定义的变量(未定义直接赋值的变量)。
2.process
process是一个全局变量,即global对象的属性。它用于描述当前Node.js进程状态的对象,提供了一个与操作系统的简单接口。下面介绍一些process对象的一些最常用的成员方法。
▲ process.argv:命令行参数数组,第一个元素是node,第二个元素是脚本文件名,从第三个元素开始每个元素是一个运行参数。
console.log(process.argv);
将以上代码存储为argv.js,通过以下命令行运行:
$ node argv.js 1991 name=byvoid --v "Carbo Kuo"[ 'node', '/home/byvoid/argv.js', '1991', 'name=byvoid', '--v', 'Carbo Kuo']
▲ process.stdout:标准输出流,通常我们使用的console.log()向标准输出打印字符,而process.stdout.write()函数提供了更底层的接口。
▲ process.stdin:标准输入流,初始时它是被暂停的,想要从标准输入读取数据,你必须恢复流,并手动编写流的事件响应函数。
process.stdin.resume();process.stdin.on('data',function(data){ process.stdout.write('read from console: ' + data.toString()); });
▲ process.nextTick(callback):为事件循环设置一项任务,Node.js会在下次事件循环调响应时调用callback。
Node.js进程只有一个线程,因此在任何时刻都只有一个事件在执行。如果这个事件占用大量的CPU时间。process.nextTick()提供了一个这样的工具,可以把复杂的工作拆散,变成一个较小的事件。
function doSomething(args , callback){ somethingComplicated(args); callback();}doSomething (function onEnd(){ compute();})
我们假设,compute()和somethingComplicated()是两个较为耗时的函数,以上的程序在调用doSomething()时会先执行somethingComplicated(),然后立即调用回调函数,在onEnd()中又会执行compute()。下面用process.nextTick()改写上面的程序:
function doSomething(args,callback) { somethingComplicated(args); process.nextTick(callback);}doSomething(function onEnd(){ compute();})
改写的程序会把上面耗时的操作拆分成两个事件,减少每个事件的执行时间,提高事件响应速度。
警告:不要使用setTimeout(fn,0)代替process.nextTick(callback),前者比后者效率要低得多。除此之外process还展示了process.platform、process.pid、process.execPath、process.memoryUsage()等方法,以及POSIX进程信号响应机制。
3.console
console用于提供控制台标准输出。
▲ console.log( ):向标准输出流打印字符并以换行符结束。console.log()接受若干个参数,如果只有一个参数,则输出这个参数的字符串形式。如果有多个参数,则以类似于C语言printf()命令的格式输出。第一个参数是字符串,如果没有参数,只打印一个换行。
console.log('Hello world');console.log('byvoid%diovyb');console.log('byvoid%diovyb',1991);
运行结果为:
▲ console.error( ):与console.log()用法相同,只是向标准错误流输出。
▲ console.trace( ):向标准错误流输出当前的调用栈。
console.trace();
运行结果为: