全局变量global,程序内都可访问使用的对象
global
使用定义方式:
⑴ 全局对象的属性(global.testvalue = 10);
⑵ 隐式定义的变量(未定义直接赋值的变量 : testvalue = 10);
⑶ 最外层定义的变量(理论,因为所写的变量都是在脚本模块中,是属于模块的变量)
全局变量可以直接拿来使用,也可以通过global.来获取
console.log(testvalue) === console.log(global.testvalue)
__dirname、__flename
__filename:当前执行脚本的脚本绝对路径
__dirname :当前执行脚本的脚本绝对路径+脚本名
Console打印输出(https://www.jianshu.com/p/f961e1a03a56)
该模块导出两个特定组件:一个Console类,一个全局的console实例。
全局则不需要调用require(‘console’)直接使用console(console日志也可写入文件,只是在运行时加入参数:node index.js 1>log.log 2>err.log)
类方法可以把输出内容写入到任意的流,构成简单的日志功能;
// 两种调用方式
// const console = require('console').Console;
// const mycl = console.Console; 或是直接实例
const fs = require('fs');
const out = fs.createWriteStream('./output.log');
const err = fs.createWriteStream('./outerr.log');
const myConsole = new console.Console(out, err);
// 写入output.log
myConsole.log('aaaaa');
myConsole.info('info');
// 写入oouterr.log
myConsole.warn('warn');
myConsole.error('error');
全局变量console
其实是一个特殊的Console
实例,它把输出写入到process.stdout
和process.stderr
,等价于:
const myConsole = new console.Console(process.stdout, process.stderr);
console.log(); 日志
console.info(); 信息
console.warn(); 警告信息
console.error(); 错误信息
console.dir(); 对对象进行检查并将该对象中的信息(属性、方法等)输出
console.time(); 不输出时间,计时开始(多个time同时只能存在一个)
console.timeEnd(); 输出距上一个console.time的时间差(不存在多个timeEnd对应一个time)
console.trace(); 追踪当前执行的代码在堆栈中的调用路径
console.assert(bool, string); bool表达式正确则无输出,错误输出string,并显示错误信息在堆栈中的调用路径
定时器:
var t1 = setTimeout(function, ms); 几毫秒后执行函数,执行一次(红黑树)
clearTimeout(t1);
var t2 = setInterval(function, ms); 几毫秒后执行函数,循环执行,间隔ms()
clearInterval(t2);
setImmediate(function) 将函数延时执行,放置当前执行函数队列尾
补充:setTimeout,setImmediate,and process.nextTick 比较(https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/)
setTimeout采用的是类似IO观察者,setImmediate采用的是check观察者,而process.nextTick()采用的是idle观察者。
三种观察者的优先级顺序是:idle观察者>>io观察者>check观察者https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
process.nextTick(callback):在事件循环的下一次循环中调用callback,在下一次Event Loop(主线程读取‘任务队列’)之前,触发process指定的callback回调函数
setTimeout 和 setImmediate将放置在事件队列尾当中
process.nextTick则在当前事件完成后阻塞事件轮询即可执行回调
注:如果两个定时器不再I/O周期内的脚本(即主模块或fs模块),则两个定时器的顺序是非确定性的,否则一定是setImmediate 在前
setImmediate(function(){
console.log(1);
})
setTimeout(function(){
console.log(2);
},0);
new Promise(function(resolve){
console.log(3);
resolve();
console.log(4);
}).then(function(){
console.log(5);
});
console.log(6);
process.nextTick(function(){
console.log(7);
})
console.log(8);
// 猜测:34 68 7 5 2 1 正确 // 3468并不是简单同步,实例化的promise对象一定会立即执行
// 34作为实例化的promise对象会立即执行,其then 5 重新进入事务队列
// 68作为方法内的log,由当前执行栈执行
// 7 当前执行栈执行完毕后,阻塞事务队列先执行
// 5 由新的执行栈顺序执行,由promise.then方法进入事务队列
// 2 由新的执行栈顺序执行,由定时器settimeout压入事务队列
// 1 由setImmediate压入事务队列