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);

查看运行结果

alt

总结

全局对象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();

查看输出结果

alt

总结

exports和module.exports都能够对外开放变量或者开放函数。但最终共享的结果,还是以module.exports 指向的对象为准。因此为了防止混乱,建议不要在同一个模块中同时使用exports和module.exports

全部评论

相关推荐

Ncsbbss:又想干活又想要工资,怎么什么好事都让你占了
点赞 评论 收藏
分享
04-30 21:35
已编辑
长安大学 C++
晓沐咕咕咕:评论区没被女朋友好好对待过的计小将可真多。觉得可惜可以理解,毕竟一线大厂sp。但是骂楼主糊涂的大可不必,说什么会被社会毒打更是丢人。女朋友体制内生活有保障,读研女朋友还供着,都准备订婚了人家两情相悦,二线本地以后两口子日子美滋滋,哪轮到你一个一线城市房子都买不起的996清高计小将在这说人家傻😅
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务