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());
1.2、global全局还有一些自定义的属性和方法
如:console
全局对象global的属性,同时console的属性值也是一个对象,node中的console的用法虽然和js里很像,但是不是同一个对象。
// 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);
原因:因为尽管setImmediate在前,但是此时还没有到事件轮询,便会执行后面的setTimeout,当setTimeout执行完,再去查看消息队列中是否还有事件,没有事件的时候也就是在末尾去执行setImmediate,因此执行的先后顺序便是如此。
3、process进程对象
process是全局对象global的属性,同时属性值也是一个对象
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' //选择开发模式
使用这个的优点在于可以更方便的去调不同环境下的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');
})