大白话面试--闭包
2019-07-02 本文已影响50人
我不信你可以
什么是闭包
MDN解释
闭包是指那些能够访问独立(自由)变量的函数 (变量在本地使用,但定义在一个封闭的作用域中)。换句话说,这些函数可以“记忆”它被创建时候的环境。
了解闭包首先了解js的‘链式作用域’结构,对象可以一级一级的向上查找父对象的变量,所以父对象的变量对子对象可见,反之不成立;所以都可以访问全局变量;为了解决函数外部无法访问函数内局部变量的问题,就在父函数中定义一个子函数并让它访问了父函数的局部变量,再通过父函数返回该子函数就实现了调用局部变量的效果;而上面中的子函数就是闭包,所以闭包的定义是“能够读取其他函数内部变量的函数”,其实简单理解就是“一个定义在函数中的函数”;
大白话来说就是函数返回一个子函数利用子函数可以访问父函数作用域内定义的变量,然后父函数return返回子函数来让父函数的外部去调用父函数从而调用来子函数来访问到父函数内定义的变量,而这个子函数就被称为闭包。其实就是1.为了解决父函数无法访问子函数内部定义的变量。2.将这个变量维持在内存中
闭包的用处
闭包可以用在许多地方。它的最大用处有两个,
- 一个是可以读取函数内部的变量
function f1(){
n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
- 另一个就是让这些变量的值始终保持在内存中
function f1(){
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000
## 闭包的好处和坏处
好处
①保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突
②在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存)
③匿名自执行函数可以减少内存消耗
坏处
①其中一点上面已经有体现了,就是被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null;
②其次由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响
## 扩展(后续补齐)
1.变量提升。
2.作用域相关。
3.垃圾回收机制原理。
链接转至:https://segmentfault.com/a/1190000013656524