Node Global对象

标签: node Globaljavascript


全部属性均可以在程序的任何地方访问,即全局变量。在javascript中,一般window是全局对象,而node.js的全局对象是global,全部全局变量都是global对象的属性,如:consoleprocess等。java

全局对象与全局变量

global最根本的做用是做为全局变量的宿主。知足如下条件成为全局变量。node

  • 在最外层定义的变量
  • 全局对象的属性
  • 隐式定义的变量(未定义直接赋值的变量)

node.js中不可能在最外层定义变量,由于全部的用户代码都是属于当前模块的,而模块自己不是最外层上下文。node.js中也不提倡自定义全局变量。数组

Node提供如下几个全局对象,它们是全部模块均可以调用的。

  • global:表示Node所在的全局环境,相似于浏览器的window对象。须要注意的是,若是在浏览器中声明一个全局变量,其实是声明了一个全局对象的属性,好比var x = 1等同于设置window.x = 1,可是Node不是这样,至少在模块中不是这样(REPL环境的行为与浏览器一致)。在模块文件中,声明var x = 1,该变量不是global对象的属性,global.x等于undefined。这是由于模块的全局变量都是该模块私有的,其余模块没法取到。浏览器

  • process:该对象表示Node所处的当前进程,容许开发者与该进程互动。bash

  • console:指向Node内置的console模块,提供命令行环境中的标准输入、标准输出功能。函数

process

  • argv 执行参数
  • env 环境变量
  • pid 当前进程id
  • chdir/cwd chdir能够改变执行的工做目录 cwd表明的时当前目录
  • nextTick 下一队列
  • stdout
  • stderr
  • stdin
  • kill
  • exit
// 标准输出 1
process.stdout.write('hello');
复制代码
// 错误输出 2
process.stderr.write('world');
复制代码
// 0 标准输入 
process.stdin.on('data',function (data) {
  console.log(data.toString())
});
复制代码
// node中有一个专门作断言的库 assert 测试用
console.assert(1===1===1,'错误');
复制代码
// 测试两个代码之间的执行时间 
console.time('tag1'); 
console.timeEnd('tag1');
复制代码
// 解析打印的详细信息
// 内部调用的是util.inspect()库的方法;
console.dir(); 
复制代码
// yargs库 能够解析用户执行命令时传递的参数
console.log(process.argv);
let args = {}
process.argv.slice(2).forEach((arg,index) => {
  if(arg.includes('--')){
    args[arg.slice(2)] = process.argv.slice(2)[index+1];
  }
});
console.log(args);
复制代码
// 环境变量 set my=dev&&node xxx.js (关掉创就就消失了);
// 用来区分代码中的环境
let url = '';
if(process.env.my === 'dev'){
  url = 'http://localhost:3000'
}else{
  url = 'http://fullstackjavascript'
}
console.log(url);

复制代码

Node还提供一些全局函数。

  • setTimeout():用于在指定毫秒以后,运行回调函数。实际的调用间隔,还取决于系统因素。间隔的毫秒数在1毫秒到2,147,483,647毫秒(约24.8天)之间。若是超过这个范围,会被自动改成1毫秒。该方法返回一个整数,表明这个新建定时器的编号。
  • clearTimeout():用于终止一个setTimeout方法新建的定时器。
  • setInterval():用于每隔必定毫秒调用回调函数。因为系统因素,可能没法保证每次调用之间正好间隔指定的毫秒数,但只会多于这个间隔,而不会少于它。指定的毫秒数必须是1到2,147,483,647(大约24.8天)之间的整数,若是超过这个范围,会被自动改成1毫秒。该方法返回一个整数,表明这个新建定时器的编号。
  • clearInterval():终止一个用setInterval方法新建的定时器。
  • require():用于加载模块。
  • Buffer():用于操做二进制数据。

Node提供两个全局变量,都以两个下划线开头。

  • _filename:指向当前运行的脚本文件名。
  • _dirname:指向当前运行的脚本所在的目录。 除此以外,还有一些对象其实是模块内部的局部变量,指向的对象根据模块不一样而不一样,可是全部模块都适用,能够看做是伪全局变量,主要为module, module.exports, exports等。

module.exports vs exports

若是想不借助global,在不一样模块之间共享代码,就须要用到exports属性。使人有些迷惑的是,在node.js里,还有另一个属性,是module.exports。通常状况下,这2个属性的做用是一致的,可是若是对exports或者module.exports赋值的话,又会呈现出使人奇怪的结果。测试

首先,exports和module.exports都是某个对象的引用(reference),初始状况下,它们指向同一个object,若是不修改module.exports的引用的话,这个object稍后会被导出。ui

exports  module.exports
    |         /
    |        /
    V       V
     Object
复制代码

因此若是只是给对象添加属性,不改变exports和module.exports的引用目标的话,是彻底没有问题的。this

可是有时候,但愿导出的是一个构造函数,那么通常会这么写:

/ b.js
module.exports = function (name, age) {
    this.name = name;
    this.age = age;
}

exports.sex = "male";
复制代码
var Person = require("./b");
var person = new Person("Tony", 33);
console.log(person); // {name:"Tony", age:33}
console.log(Person.sex); // undefined
复制代码

这个sex属性不会导出,由于引用关系已经改变:

exports  module.exports
    |          |
    |          |
    V          V
   function   Object
复制代码

若是但愿把sex属性也导出,就须要这样写:

exports = module.exports = function (name, age) {
    this.name = name;
    this.age = age;
}

exports.sex = "male";
复制代码

再好比,不少时候能够看到,在node中有两种方法能够输出变量:

// 方法一:对module.exports赋值:

function hello(){

console.log('hello word');

}

function greet(name){

console.log('hello'+name);

}

module.exports = {

hello:hello,

greet:greet

}

// 方法二直接使用exports:

function hello(){

console.log('hello word');

}

function greet(name){

console.log('hello'+name);

}

function hello(){

console.log('hello word');

}
exports.hello = hello;
exports.greet = greet;

//可是不能够直接对exports赋值,直接赋值的话代码能够执行,可是没有输出任何变量(exports = {hello = hello,greet = greet})。

复制代码

load()函数最终返回module.exports;

var load = function(exports,module){

    return module.exports;

}

var exported = load(module.exports,module);
复制代码

也就是说,默认状况下node准备的exports和module.exports实际上指向同一个空对象,可是若是咱们输出的是函数或者数组,就只能给module.exports赋值。

总结

  • node.js 设计的2个导出引用的对象,反而增长了迷惑性。
  • 避免污染全局空间。
相关文章
相关标签/搜索