function aa (a){
function bb(){
console.log(a)
}
}
var cc = aa('xiao')
cc.bb();
上述代码会报错,因为不可以直接通过外部函数调用它的内部函数
模块模式
当通过返回一个含有属性引用的对象的方式来将函数传递到词法作用域外部时,我们已经创造了可以观察和实践闭包的条件,内部函数的词法作用域(闭包),也就是foo() 的内部作用域。
function aa (a){
function bb(){
console.log(a)
}
return {
bb:bb
}
}
var cc = aa('xiao')
cc.bb();
模块模式特点
1.必须有外部的封闭函数,该函数必须至少被调用一次(每次调用都会创建一个新的模块实例)。
2.封闭函数必须返回至少一个内部函数,这样内部函数才能在私有作用域中形成闭包,并且可以访问或者修改私有的状态。
3.模块也是普通的函数,并且可以接收参数
4.模块模式另一个简单但强大的变化用法是,命名将要作为公共API返回的对象
//单例模式-立即调用这个函数并将返回值直接赋值给单例的模块实例标识符foo
var foo = (function CoolModule(id){
function change(){
publicAPI.identify = identify2;
}
function identify1(){
console.log(id);
}
function identify2(){
console.log(id.toUpperCase());
}
publicAPI = {
change:change,
identify:identify1
}
return publicAPI;
})("foo module");
foo.identify();
foo.change();
foo.identify();
通过在模块实例的内部保留对公共API对象的内部引用,可以从内部对模块实例进行修改,包括添加或删除方法和属性,以及修改它们的值。