闭包
js 的作用域分两种,全局和局部,基于我们所熟悉的作用域链相关知识,我们知道在 js 作用域环境中访问变量的权利是由内向外的,内部作用域可以获得当前作用域下的变量并且可以获得当前包含当前作用域的外层作用域下的变量,反之则不能,也就是说在外层作用域下无法获取内层作用域下的变量,同样在不同的函数作用域中也是不能相互访问彼此变量的,那么我们想在一个函数内部也有限权访问另一个函数内部的变量该怎么办呢?闭包就是用来解决这一需求的,闭包的本质就是在一个函数内部创建另一个函数。
闭包特性:
1、函数嵌套函数
2、函数内部可以引用函数外部的参数和变量
3、参数和变量不会被垃圾回收机制回收
闭包的使用
函数作为返回值 A
const fn = function () {
const name = "dov";
return function () {
return name;
};
};
const a = fn();
console.log(a()); // dov
a()中的返回值是一个匿名函数,这个函数在 a()作用域内部,所以它可以获取 a()作用域下变量 name 的值,将这个值作为返回值赋给全局作用域下的变量 b,实现了在全局变量下获取到局部变量中的变量的值
函数作为返回值 B
const fn = function () {
var a = 3;
return function () {
var b = 1;
console.log(++a, ++b);
};
};
const a = fn();
a(); // 4 2
a(); // 5 2
一般情况下,在函数 fn 执行完后,就应该连同它里面的变量一同被销毁,但是在这个例子中,匿名函数作为 fn 的返回值被赋值给了 fn1,这时候相当于 fn1=function(){var n = 0 … },并且匿名函数内部引用着 fn 里的变量 num,所以变量 num 无法被销毁,而变量 n 是每次被调用时新创建的,所以每次 fn1 执行完后它就把属于自己的变量连同自己一起销毁,于是乎最后就剩下孤零零的 num,于是这里就产生了内存消耗的问题
闭包的优缺点
优点
保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突
在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存)
匿名自执行函数可以减少内存消耗
缺点
其中一点上面已经有体现了,就是被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为 null;
其次由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响
218

被折叠的 条评论
为什么被折叠?



