nodejs-global初识

全局变量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.stdoutprocess.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压入事务队列

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值