函数作用域:定义一个function,在函数中定义的变量只能在函数内被访问,出函数就访问不了
类比模块作用域:在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问限制----------------------减少了全局变量污染的问题
模块中定义的变量和方法在调用中没有访问访问权限
console.log('这是自定义的模块1 检验模块作用域问题');
const username='张三';//模块中的全局变量
function say(){
console.log('大家好,我是'+username)
}
const f1=require('./test_md');//加载自定义模块---会加载模块的所有内容
console.log(f1);//使用f1接收模块 f1默认是空对象
如何向外共享模块作用域中的成员:
- module对象:每个js自定义模块中都有一个 module,他里面存储了和当前模块有关的信息
里面的信息如下:
- path:当前模块的存储路径
- filename:当前模块的文件名称
- exports:向外共享成员,让模块内的成员可以被外界访问到。module.exports对象,将模块中的成员共享出去,提供给外界使用
console.log('这是自定义的模块1 检验模块作用域问题');
const username='张三';//模块中的全局变量
function say(){
console.log('大家好,我是'+username)
}
console.log(module);
这是自定义的模块1 检验模块作用域问题
Module {
id: '.',
path: 'E:\\nodejs实验\\js',
exports: {},
filename: 'E:\\nodejs实验\\js\\test_md.js',
loaded: false,
children: [],
paths: [
'E:\\nodejs实验\\js\\node_modules',
'E:\\nodejs实验\\node_modules',
'E:\\node_modules'
]
}
所以实际上我们使用require导入的模块,所使用的变量是原来模块的module.exports指向的那个对象
module.exports.username='张三';//对外提供变量
module.exports.say=function(){
console.log('大家好,我是'+username)
};//对外提供方法
暴露模块的私有成员:
使用module.exports.对外的接口=模块内的变量
使用module.exports.对外的接口函数=模块内的函数
module.exports.username=username;
const username='李四';
function say(){
console.log('大家好,我是'+username)
}
module.exports.a=username;
module.exports.say=say;
使用require()方法导入模块的注意点:永远以module.exports指向的对象为主(进行了重新的指向)
const age='李四';
module.exports.age=age;
module.exports.username='张三';//对外提供变量
module.exports.say=function(){
console.log('大家好,我是'+username)
};//对外提供方法
//让 module.exports指向全新对象
module.exports={
nickname:'小白',
sayhi(){
console.log('hi');
}
}