全局对象和全局变量
概念:所有属性都可以在程序的任何地方访问,即全局变量。在JavaScript中,通常window是全局对象,而Node.js的全局对象是global,所有全局变量都是global对象的属性,如:console、process等。
global最根本的作用是作为全局变量的宿主,满足一下条件称为全局变量
1. 在最外层定义的变量
2. 全局对象的属性
3. 隐式定义的变量
▲ 在node中不可能在最外层定义变量,因为所有的用户代码都是属于当前模块的,而模块本身是不属于最外层上下文的.
全局对象process
它用来描述当前Node.js进程状态的对象,提供了一个与操作系统的简单接口,通常写本地命令行
的程序的时候都会用到它。
下面来介绍几个常用的方法:
1. process.argv:命令行参数数组,在命令行中使用,第一个元素是node,第二个元素是要运行脚本文件名,从第三个元素开始每个元素都是一个运行参数。
我们在建立一个文件叫做process.js
,里面只需要包含打印这个函数信息的代码就可以
console.log(process.argv);
然后通过命令行来运行这个文件,
如上图,这个方法就是所有的参数变成了一个数组
2. process.stdout(stdout => standard output)标准输出流,我们用的console.log的底层就是使用这个实现的
下面的代码就是实现console.log
的代码:
console.log=function(msg){
process.stdout.write(msg);
}
console.log("shangyilong");
- process.stdin(standard input)是标准输入流,在老版本的标准流中,初始的时候他是被默认暂停的,想要从标准输入流中读取数据,必须通过
process.stdin.resume()
恢复流并编写流的事件相应的函数,在新版中是不用恢复流操作的也就是说标准输入流默认是开始的,当然新版的标准流操作是兼容老版本的流操作的这个是旧版本的标准流操作
//先要恢复流
process.stdin.resume();
//绑定上相应的事件
process.stdin.on(‘data‘,function(some){
process.stdout.write(some.toString());
});
下面的新版本的标准输入流操作
//绑定上相应的事件,除了data事件之外readable也可以监听输入,这个事件的回调函数就没有参数了
process.stdin.on(‘readable‘,function(){
var data = process.stdin.read();
if(data !== null){
process.stdout.write(data);
}
});
// process.stdin.on(‘readable‘)
process.stdin.on(‘end‘,function(){
process.stdout.write(‘is end‘);
});
- process.stderr是标准错误流,和process.stdout差不多只是输出的颜色不一样,看下图
这是在webstrom的效果在命令行中是看不出的
- process.cwd():表示当前文件的绝对路径,这个和
__dirname
是有不同的__dirname
输出的是通过node执行的js文件所在的绝对路径,看下图就能理解了, - process.on()
- process.on(‘exit’,function(){})表示当程序退出的时候会触发,
process.on(‘exit‘,function(){
console.log("process will exit");
})
//output process will exit
- process.on(“SIGINT”,function(){}) (SIGINT=>signal interrupted)当我们退出程序的时候会触发这个函数,看下面的代码:
process.stdin.on(‘readable‘,function(){
var data = process.stdin.read();
if(data !== null){
process.stdout.write(data);
}
});
// process.stdin.on(‘readable‘)
process.stdin.on(‘end‘,function(){
process.stdout.write(‘is end‘);
});
process.on(‘exit‘,function(){
console.log("process will exit");
});
process.on(‘SIGINT‘,()=>{
console.log(‘program will exit‘);
//表示退出程序
process.exit();
});
下图就是退出后的结果图:
7. process.nextTick().要理解这个还需要知道Node中的事件循环
机制,如果不懂可以看我的另一篇博文:
这个函数的功能就是为事件循环设置一项任务,Node会在下次事件循环响应时调用这个的回调函数;
这个函数也可以算的上是把复杂的事情拆分,编程小的进程;下面来看代码具体的解释一下:
function doSomeThing(data){
console.log(data);
}
console.time("one");
function do1(arg,cb){
doSomeThing(arg);
doSomeThing(arg);
doSomeThing(arg);
doSomeThing(arg);
doSomeThing(arg);
doSomeThing(arg);
cb();
}
console.timeEnd(‘one‘);
console.time(‘two‘);
function do2(arg,cb){
doSomeThing(arg);
doSomeThing(arg);
doSomeThing(arg);
doSomeThing(arg);
doSomeThing(arg);
doSomeThing(arg);
process.nextTick(cb);
}
console.timeEnd(‘two‘);
//output : 1ms
//output : 0ms
根据上面的时间的测试就能看出来效率
更多内容请看下一篇文章
这是Node的一个系列,可以在本栏目下看其他关于Node文章,会 一直更新,有问题请在下方留言