标签: node Globaljavascript
全部属性均可以在程序的任何地方访问,即全局变量。在javascript中,一般window是全局对象,而node.js的全局对象是global,全部全局变量都是global
对象的属性,如:console
、process
等。java
global最根本的做用是做为全局变量的宿主。知足如下条件成为全局变量。node
node.js中不可能在最外层定义变量,由于全部的用户代码都是属于当前模块的,而模块自己不是最外层上下文。node.js中也不提倡自定义全局变量。数组
global:表示Node所在的全局环境,相似于浏览器的window对象。须要注意的是,若是在浏览器中声明一个全局变量,其实是声明了一个全局对象的属性,好比var x = 1等同于设置window.x = 1,可是Node不是这样,至少在模块中不是这样(REPL环境的行为与浏览器一致)。在模块文件中,声明var x = 1,该变量不是global对象的属性,global.x等于undefined。这是由于模块的全局变量都是该模块私有的,其余模块没法取到。浏览器
process:该对象表示Node所处的当前进程,容许开发者与该进程互动。bash
console:指向Node内置的console模块,提供命令行环境中的标准输入、标准输出功能。函数
// 标准输出 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);
复制代码
module, module.exports, 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赋值。