Node方向:global全局属性、定时器以及process进程对象

1、node中的全局属性

node中有一个全局对象global

1.1、定义全局属性和方法

global.属性 = 属性值
user.js:定义全局属性和全局方法

global.name = '小陈同学';
global.fn = function(){
    return 'global fn'
}

index.js:调用属性值跟全局方法

const user = require('./user');
console.log(name);
console.log(fn());
powershell执行结果.png
1.2、global全局还有一些自定义的属性和方法

如:console
全局对象global的属性,同时console的属性值也是一个对象,node中的console的用法虽然和js里很像,但是不是同一个对象。


全局对象的console.png
// console.dir 打印路径
console.dir(file);
// console.count 计数(其中括号内的作为标识)
console.count('i');
console.count('i');
console.count('i');
// 打印结果
i:1
i:2
i:3

console.time:测试打印时间

//测试打印到1000所需时间(毫秒数)
console.time('time');
for(var i = 0; i<1000;i++){

}
console.timeEnd('time');
结果:
time: 1.917ms

console.assert():断言
assert断言,接受两个参数,第一个参数是断言条件,第二个是断言输出
如果断言失败,输出后面的部分

// 此时断言为真,不会打印值
console.assert( 5 < 7 , '断言失败' )
//此时断言为假,输出
console.assert( 5 > 7 , '断言失败' )
结果:
Assertion failed: 断言失败

2、node中的全局方法

在javascript中,setInterval和clearInterval是浏览器提供的API,node中也提供了这两个方法,但是是node重写了这个方法并且将方法挂载到了global对象。使用方法与js差不多
setTimeInterval

setInterval(function(){
    console.log('set');
},1000);
结果:
set
set
set
....

在setTimeInterval中 ,从第三个参数开始往后,都会作为函数的实参传进去

// A,B会赋给x,y
setInterval(function(x,y){
    console.log(x+y);
},1000,'A','B')
结果:
AB
AB
AB
AB
.....

在javascript中,如果第一个参数为字符串,那么会强制的转为js语句去进行执行,看下面示例

// 在javascript中
setInterval('console.log(123)', 1000);
结果:
123
123
123
123
.......

或者前面定义了一个方法,然后将方法名称作为字符串写进去

function fn(){
  console.log(123);
}
setInterval('fn()',1000);

但是在node环境中,这样的写法是会报错的,node中定时器和js中区别就在于第一个参数它是不能为字符串的,js中第一个参数如果为字符串,会强制当成一个语句去执行,转为语句也执行不了的话才会报错。
clearInterval
清除定时器

let  timer = setInterval(function(){
  console.log(123);
},1000)

// 清除定时器
setTimeout(function(){
  clearInterval(timer);
},3000)

setTimeout
一定时间后才会执行该部分

// 2秒后执行
let  timer = setTimeout(function(){
  console.log(123);
},2000)

setImmediate
用法和定时器很像,但是不是属于定时器,不需要传递时间,类似于requestanimation()[当到了浏览器的刷新频率便会执行],这个也一样,会在每次的事件轮询的时候去执行(事件末尾)。
执行顺序
setTimeout在前,setImmediate在后

setImmediate(function(){
    console.log('setImmediate')
})
setTimeout(function(){
    console.log('setTimeout')
},0);
顺序结果.png

原因:因为尽管setImmediate在前,但是此时还没有到事件轮询,便会执行后面的setTimeout,当setTimeout执行完,再去查看消息队列中是否还有事件,没有事件的时候也就是在末尾去执行setImmediate,因此执行的先后顺序便是如此。

3、process进程对象

process是全局对象global的属性,同时属性值也是一个对象


process对象打印.png
3.1、argv参数

包括命令路径和运行的文件路径以及参数的集合

console.log('process',global.process.argv);

process [
  'C:\\Program Files\\nodejs\\node.exe',
  'D:\\node\\demo\\index.js'
]
3.2、execPath属性

启动Node.js进程的可执行文件的绝对路径名,就是process.argv数组中的第一个值。

console.log('process',global.process.execPath);

process C:\Program Files\nodejs\node.exe
3.3、env 环境变量

这个在开发过程中用来甄别是属于开发环境还是生产环境
开发环境:主要针对的是开发的过程,开发过程中用到的一系列函数、依赖等。
生产环境:主要针对是打包上线后的过程,会压缩css,js等

process.env.NODE_ENV = 'devlopment' //选择开发模式
env打印.png

使用这个的优点在于可以更方便的去调不同环境下的IP地址

const  env = {
  devlopment: 'http://127.0.0.1',
  product: 'http://192.168.11.22'
}
// 代码是生产环境下还是开发环境下
if(process.env.NODE_ENV === 'devlopment'){
  console.log('开发环境的部分')
}else{
  console.log('生产环境的部分')
}

3.4、cwd()方法

返回Node.js进程的当前工作的目录路径

console.log(process.cwd())
//返回文件路径
D:\node\demo

__dirName
这个是返回当前项目的根目录,而cwd()返回的是当前运行的文件的路径。

3.5、nextTick()方法

接受参数,第一个参数必填,是回调函数,第二个之后的参数是可选的,就是第二回调函数的参数。
process.nextTick()方法将callback添加到下一个时间点的队列,在javascript堆栈上的当前操作运行完成后及允许事件循环继续之前,此队列被完成耗尽,如果要递归调用process.nextTick(),则可以创建无限循环。

简单说:就是在下一个任务队列中去执行

setImmediate(function(){
    console.log('setImmediate')
})

setTimeout(function(){
    console.log('setTimeout')
},0)

process.nextTick(function(){
    console.log('nextTick');
})
执行顺序.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容