global对象与模块作用域
1. global对象
首先在node.js中,默认是模块化的,默认声明的变量、函数仅属于当前的文件模块,都是私有的,只能在当前模块作用于范围内使用。但若想在全局范围内给某个变量赋值,就可以用全局对象global。
global对象类似于浏览器中的Window对象,用于定义全局命名空间。除global自身以外的全局变量都是global对象的属性,实际使用时可以省略global。
global对象的使用演示
let foo = 'bar';
console.log(foo);
//global对象这时是没有foo属性的
console.log('global:foo '+global.foo);
//为global对象挂载一个foo变量,并将该文件模块中foo的值赋值给它
global.foo = foo;
//这是global.foo的值为'bar'
console.log('global:foo '+global.foo);
查看运行结果
总结
全局对象global可以通过属性挂载的方式使变量变为全局变量,实现文件模块与文件模块之间的数据共享。
缺点:在一个文件模块中,一个全局变量的出现位置和使用时机并非是确定的,大量使用global挂载全局变量会污染命名空间,容易造成耦合问题。
2. 模块作用域
模块化编程的思想,是为了不造成变量和函数的污染。为了解决global对象的局限性,node.js提供了一个简单的模块系统。exports是模块公开的接口,require()函数用于获取外部的模块接口,也就是获取模块的exports或module.exports对象。
默认情况下,exports 和 module.exports 指向同一个对象。最终共享的结果,还是以 module.exports 指向的对象为准
CommonJS规定:
- 每个模块内部,module变量代表当前模块。
- module变量是一个对象,它的 exports 属性(即 module.exports)是对外的接口。
- 加载某个模块,其实是加载该模块的 module.exports 属性。require() 方法用于加载模块
模块内容共享演示
/**
* @param Goenitz.js
*/
exports.nickname = '息吹之岚'
exports.name = '七枷社'
module.exports.name = '高尼茨'
module.exports.dianshi = function () {
console.log('我看了电视!')
}
/**
* @param test.js
*/
//1.使用require()函数加载模块
const role = require('./Goenitz')
//2.输出模块内容、模块内的变量值
console.log(role)
console.log(role.name)
console.log(role.nickname + role.name)
//3.调用模块方法
role.dianshi();
查看输出结果
总结
exports和module.exports都能够对外开放变量或者开放函数。但最终共享的结果,还是以module.exports 指向的对象为准。因此为了防止混乱,建议不要在同一个模块中同时使用exports和module.exports