作用域闭包
这段代码看起来和潜逃作用域中的示例代码很相似。基于词法作用域的查找规则,函数bar( )
可以访问外部作用域中的变量a。但是这并不是严格意义上的闭包。对于函数bar
引用a
的解释是这只是词法作用域查找的规则,但这个规则知识闭包的一部分。
举一个例子:
function baz( ) {
console.log( a ); // 2
}
bar( baz);
}
function bar( fn ) {
fn( ); // ==> 这里就是闭包
}
foo( );
在上面的代码中,baz
在他所定义的词法之外被调用,但是baz
仍旧可以访问它定义时的词法作用域。
无论通过何种手段将内部函数传递到所在的词法作用域以外,它都会持有对原始定义作用域的引用,无论在何处执行这个函数都会使用闭包。
模块
模块模式可以通过返回包含对内部属性引用的对象形式。模块模式需要具备的两个必要条件
当只需要一个实例的时刻可以利用IIFE来完成。
模块模式的另外一个简单但强大的变化用法是,命名将要作为公共API返回的对象。