1、闭包的含义
闭包 :
指一个定义在函数内部并有权访问此函数作用域的变量的函数
。
MDN官方解释的闭包:
一个函数和对其周围状态(语法环境)的引用捆绑在一起(或者说是函数被引用包围),这样的组合就是闭包。
看得懂这含义吗?看不懂没关系看下面代码:
function f1(){
var x=2;
function f2(){
console.log(x); //输出 2
}
f2();
}
// 在上面代码中 f2函数 就是一个闭包。f2函数可以访问 f1函数作用域中的变量 x 。
再问看得懂上面闭包的含义了吗?看不懂没关系,自己去把什么是函数及什么是作用域搞清楚再来QAQ。
当然上面的代码可以变变形,如下:
//当然在变形前先了解下(函数的引用)和(匿名函数)
//函数引用:在我们调用函数时,首先会写函数引用(即 f1,此引用储存在栈中,存放的有引用和指向堆中的地址),然后再写 f1()执行(这时引擎会根据栈中获得的f1函数的地址指针,再从堆内存中取得所需的数据)
//匿名函数:没有函数名的函数,例如:function(){ ...},常用于闭包
function f1(){
var x=2;
return function(){
console.log(x);
}
}
var func=f1();
func(); //输出 2
// 上面 f1()的值就是里面匿名函数的引用,把引用值赋给func,然后func()就执行了匿名函数(这里的匿名函数就是闭包)
如果你需要要给 里面的匿名函数 添加一些逻辑或参数 并返回结果 可以这样写:
function f1(){
var x=2;
return function(y){
return x+y;
}
}
var func=f1();
var func2=func(3);
console.log(func2); //输出 5
2、闭包的作用
作用:
一个是可以读取函数内部的变量,另一个是让这些变量的值始终保存在内存中
为什么说闭包访问的外部变量可以始终保存在内存中?
我的理解是结合前面说到的函数引用,
每创建一个新的函数就会在堆中开辟一个新的内存空间
,
那么在闭包内 访问外部变量时会复制一个变量地址 存储到闭包这块内存中
(闭包里有变量的引用时会形成不被销毁的栈内存,把一些值保存下来),由此就造成当外部函数执行完了却影响不到保存在闭包内的变量
然后闭包的内存空间得到释放时,这个变量才会被当作垃圾回收删除。(关于变量何时被垃圾回收机制回收,可以说是所有作用域都没有引用它时,才会被回收 )
特殊的闭包写法:let ss=(functuion(){…})( );
3、闭包的应用场景
1、防抖、节流
2、控制访问权限,模拟私有方法,数据隐藏
3、公有方法调整字号
4、实现多个定时器独立