JS模块是啥
- 具有特定功能的JS文件
- 将所有的功能和数据封装在一个函数的内部,即数据和功能都是私有的
- 只向外部暴露一个包含n个方法的对象或函数
- 模块的使用者只能通过模块主动暴露的对象方法了来实现对应功能
自己定义一个简单的JS模块
myModule.js:
function myModule(){
//私有数据
var msg = 'My JS Module'
//内部方法
function doUpper(){
console.log('doUpper(): ' + msg.toUpperCase())
}
function doLower(){
console.log('doLower(): ' + msg.toLowerCase())
}
//向外暴露
return {fn1:doUpper, fn2:doLower}
}
main.js
var M = myModule()
M.fn1() //打印出doUpper(): MY JS MODULE
M.fn2() //打印出doLower(): my js module
这怎么就用到了闭包
- 在 main.js 中,使用了一个全局变量M去接收myModule.js的函数的返回值,此时相当于变量M拥有了myModule.js里面的函数的方法,这就满足了闭包的定义了
- main.js的全局执行上下文中本身不存在
"My JS Module"
这句话,但是在myModule.js的函数中中定义的两个方法时,main.js的全局变量M引用了这个函数对象,所以可以在内存中找到这句话,并进行处理后打印到控制台上