node.js里面的全局变量
在node.js开发中,你一定用到过 console 类来打印一些东西或者debug.但是你在使用console类之前一定没有require 相关的包.
有的人会说,console 是node.js核心自带模块,不需要require ,错了,这里容易理解错.
核心代码库是你安装node.js时已经包含了并编译了此模块.
核心模块定义在node源代码的lib/目录下.
但是用的时候还是要require 一下.比如上一篇博文提到的node.js里querystring类的使用,这个就是核心代码库自带的,但是你用的时候还是要require('querystring');
而我们常常拿来直接就用的都是全部变量.
node.js有一个全局变量宿主 global ,而我们直接使用的这些全局变量都是这个宿主的一个属性.
比如
(一)process
他描述了node.js的进程状态.提供了一个和操作系统简单的接口.
process 属性还包括好多属性,
标准的输入流 process.stdout 这个属性下还有各自的属性方法.....
标准的输出流 process.stdin 同上,也有自己的属性方法.....
事件循环 process.nextTick 有什么任务不能在当下执行完,需要交给下次事 件循环响应,比如占用大量cpu的一个IO密集型运算...
(二)console
比较常用的控制台标准输出类,向标准输出流 (stdout)和标准错误流(stderr)输出错误.
它可以接受若干个参数,用逗号分隔
console.log('aaa','bbb','ccc','dddd'); console.error() 输出当前错误流. console.trace() 输出当前调用栈.
(三)Buffer
javascript对字符处理还是比较强的,但是对于二进制却非常棘手,所以有了Buffer,它把原始数据放在Buffer类的实例中,而这个实例类似一个数组,储存在V8堆之外的分配区域.
它有很丰富的方法属性足够单独开一篇博客来谈.
(四)require
这个方法就是我们经常用来引用包的方法,实际上它属于Modules类,本地的每个Modules都有此方法,所以也可以理解成是一个全局的方法,比如 require('http');
(五)__filename
获取当前所执行代码文件的路径,可以获得代码文件所在的绝对路径.也被称作node.js中的魔术变量.
(六)__dirname
获取当前执行脚本所在的目录,同上,也是node.js中的魔术变量.
(七)module
这个类和require类似,其实是属于每个模块的本地方法,直接拿来使用,你也可以理解成一个全局变量.
module下有个非常重要的方法 exports
(八)exports
exports 和 module.exports 其实是一样的,但是为了简化使用,exports 是 module.exports 的一个引用,他们最终指向一个对象.
我们从一个模块导出一个方法 exports.myfunction 等价于 module.exports.myfunction 明显前面的用户很简单,书写更少的代码.
(九)setTimeout(function(){},ms)
定时器,在指定ms好秒后运行前面的function 调用一次
使用: var t=setTimeout(function(){},ms);
(十)clearTimeout(t)
上面定义的定时器,可以用这个方法来移除.
(十一)setInterval(function(){}, ms)
每过ms好秒后,重复执行 function
使用: var t=setTimeout(function(){},ms);
(十二)clearInterval(t)
移除上面的 setInterval,取消定时重复任务.
总结,除去上面的全局对象方法,如果有需要你也可以自己定义全局变量.
定义方法,在入口文件定义,如下代码
global.pageInfo = { title:"一介布衣", url:"http://yijiebuyi.com" }
如何使用:在项目的任意一个模块里直接引用 pageInfo.title 或 pageInfo.url 无需require任何东西.
还有一种定义全局变量的方法:利用javascript中Object的方法defineProperty定义属性的方法
Object.defineProperty(global, "pageInfo", { value: { title:"一介布衣", url:"http://yijiebuyi.com" }, writable: false //定义该属性只读 ,true 表示该属性值可被修改 });