闭包,是一个精准又难懂的计算机词汇。官方给出的解释是:函数与对其状态即词法环境(lexical environment)的引用共同构成闭包(closure)。听起来十分晦涩难懂,那么,本文用通俗的语言对JS中的闭包进行解释。
要理解闭包,首先要理解函数在计算机中的存在形式。函数存在两个阶段,分别是定义阶段和调用阶段。在函数的定义阶段,计算机先要开辟一块函数存储空间用来放函数主题(这个空间的函数主体只是以一串字符串的形式存在),然后把这个存储空间的地址赋值给函数名。而执行阶段呢,就是在执行的时候,根据函数名的地址找到那块函数存储空间,再次开辟一个函数执行空间,在这个空间中执行4步:
1,在函数执行空间内部进行形参赋值
2,在执行空间内进行预解析
3,把存储空间的函数体复制到执行空间执行
4,销毁这个执行空间
下面给图片解释
function fn(){
var a = 100;
console.log(a)
}
fn()
这两个就是定义函数执行函数时候,计算机干的事情。那么,怎么能让这个执行空间不被销毁呢?
一个不被销毁的的函数执行空间必须满足两点要求:
1,定义的函数里面要返回一个复杂数据类型;
2,在函数外面必须要有变量接收这个被返回是复杂数据类型;
例如:
function a(){
var num = 200;
return function b(){
console.log(num)
}
}
var res = a()
再来谈到闭包,那么闭包又要满足什么条件呢?就是定义一个函数A的时候,直接或间接返回另一个函数B,函数B中使用着A的私有数据,同时在函数外面要有变量接收这个被返回的函数B,那么就形成了一个闭包空间,上面的代码就是一个闭包空间。
那么,闭包有什么用呢或者说闭包的特点呢?
1,闭包可以延长变量的声明周期,由于执行空间不会销毁那么变量就会一直存在;
2,可以在函数外部访问内部的数据;
3,可以保护私有变量,函数内部的变量不能再外部访问;
另外,闭包使用时也要有注意事项:
由于闭包中执行空间不会被销毁,使得函数内部的变量也会一直存在,就会消耗内存,可能会导致内存的泄露问题。
以上就是本人对闭包的理解啦,如果有什么错误的地方还希望提出来,一起学习进步~