JS闭包
了解什么是闭包
先来一段代码,根据代码分析能更容易理解:
function a() {
var num = '我是函数a的变量num';
return function b() {
console.log(num);
}
}
var res = a();
res();
从函数a上看:有一个函数a,在函数a的内部,返回了一个函数b,而函数是一个复杂数据类型,即在一个函数内部,返回了一个复杂数据类型。
从函数b上看:函数b中,访问着函数a的里面的变量(数据),也就是在一个被返回的函数里,有一个外部作用域的变量。
从函数a外部看:有一个变量res,引用了函数a,但是由于函数a内部存在有一个返回值函数b,则,这个变量,相当于在引用了函数b(调用函数a,执行结果就是函数b)。
代码上的分析:
function a() {
//这个 num 变量就是函数 a 的变量
var num = '我是函数a的变量num';
return function b() {
//这里在后台输出的num,是函数a的变量
console.log(num);
}
}
//res 所接收到的是 a 函数执行以后的返回值
//而这个返回值就是函数 a 内部返回的一个复杂数据类型(函数b)
//这个时候,触发了一个不会销毁的函数空间
//导致执行函数a的执行空间不会被销毁
var res = a();
//接下来可以随时调用这个变量res
//res 是一个 函数a 里面返回的 函数b
//res所输出的,就是函数a内部的变量num
res();
/*
补充(大概说明):
什么是一个不会销毁的执行空间:
当一个函数内部,返回的是一个复杂数据类型,
并且函数外部存在一个变量,接收这个复杂数据类型的时候,
这个函数的执行空间不会被销毁。
*/
JS的闭包,就是能够读取其他函数内部变量的函数。
JS闭包的生成条件
1、在函数 a 内部直接或者间接返回一个函数 b;
2、b 函数内部使用着 b 函数的变量(数据);
3、a 函数外部有一个变量接受着函数 b。
在所形成的一个不会销毁的函数空间,我们管这个空间叫做闭包空间,把函数a里面返回的函数b, 叫做函数a 的闭包函数。
JS闭包的特点
优:
1、存在的变量能够长期存储在内存中(延长变量生命周期);
2、利用闭包函数,可以访问函数的变量(数据);
3、避免变量不会被外界所访问。
缺:
1、增加内存的的使用量;
因为在内存空间中,一直存在着一个不会销毁的空间,会导致内存被占用
2、容易造成内存泄漏。
当内容被占用过多时,会导致内存溢出,也就是内存泄漏
来源:CSDN
作者:MoonStarlight
链接:https://blog.csdn.net/MoonStarlight/article/details/104456728