#我的21天#《你不知道的javascript》- D5

前端之家收集整理的这篇文章主要介绍了#我的21天#《你不知道的javascript》- D5前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

作用域闭包

函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。

这段代码看起来和潜逃作用域中的示例代码很相似。基于词法作用域的查找规则,函数bar( )可以访问外部作用域中的变量a。但是这并不是严格意义上的闭包。对于函数bar引用a的解释是这只是词法作用域查找的规则,但这个规则知识闭包的一部分。

函数在定义时的词法作用域以外的地方被调用。闭包使得函数可以继续访问定义时的词法作用域。

举一个例子:

 function baz( ) {
     console.log( a ); // 2
 }

 bar( baz);

}
function bar( fn ) {
fn( ); // ==> 这里就是闭包
}
foo( );

在上面的代码中,baz在他所定义的词法之外被调用,但是baz仍旧可以访问它定义时的词法作用域。

无论通过何种手段将内部函数传递到所在的词法作用域以外,它都会持有对原始定义作用域的引用,无论在何处执行这个函数都会使用闭包。

模块

模块模式可以通过返回包含对内部属性引用的对象形式。模块模式需要具备的两个必要条件

  • 必须有外部的封闭函数,该函数必须至少被调用一次(每次调用都会创建一个新的模块实例)。

  • 封装函数必须返回至少一个内部函数,这样内部函数才能在私有作用域中形成闭包,并且可以访问或修改私有的状态。

当只需要一个实例的时刻可以利用IIFE来完成。
模块模式的另外一个简单但强大的变化用法是,命名将要作为公共API返回的对象。

小结

函数可以记住并访问所在的词法作用域,即使函数是在当前词法作用域之外执行,这时就产生了闭包。

猜你在找的JavaScript相关文章