维基百科中的解释,闭包存储了函数以及函数定义时的环境变量(自由变量)。
在谈闭包的时候,有个概念需要说明一下:Scope Chain 作用域链。
Scope Chain
每个函数都有自己的作用域以及外部的作用域,甚至是全局的作用域。当函数试图访问一个变量的时候,会现在这个函数的local env中查找。如果没有,就到外部环境中查找。一层一层往外寻找,直到找到对应的变量或者到达了global env还是没有找到,那么这个变量就是undefined。
举一个例子:
let txt = 'This is outsides.';
function log () {
let txt = 'This is insides.';
console.log(txt);
}
log();
// The output: This is insides.
输出的结果是This is insides
而不是This is insides.
的原因就是,函数先从最内层作用域开始寻找这个变量,一旦找到了就不在接着寻找了。
Use Case
-
缓存变量
当你在闭包当中访问了外部变量的时候,这个变量会被添加到这个闭包当中,即Execution Context。这种办法能使得外部的一些临时变量不会被当做垃圾清理了。 -
实现单例
其实这也是缓存变量的应用。在代码上:
class Earth(){...}
function TheEarth(){
let singleton = null;
return {
getEarth(){
if (singleton){ return singleton; }
createEarth();
return singleton;
}
createEarth(){ singleton = new Earth(); }
}
}
export default TheEarth();
然后,你就可以调用了:
import TheEarth from '../Earth';
TheEarth.getEarth()
网友评论