前言
首先我们得先了解闭包是什么,再深入的了解一下闭包的优缺点。
一、闭包是什么?
官方的回答就是:能够读取其他函数内部变量的函数叫做闭包。换句话说:函数嵌套,内层函数就形成了闭包。闭包简单理解成"定义在一个函数内部的函数"本质上说一个函数就是一个闭包。下面就写一个简单的闭包案例:
function F1(){
var a = 10;
return function(){
console.log(a);
}
}
var a = 20;
var f1 = F1();
f1();
二、闭包特点
1. 作为一个函数的返回值,当函数返回时,其处于激活状态。
2. 参数和变量不会被垃圾回收机制回收。
三、闭包优缺点
1.闭包优点
可以重复使用变量并且不会造成变量污染,可以隔离作用域,不会全局污染 闭包结合了全局变量和局部变量的优点,可以用来定义私有属性和私有方法 全局变量可以重复使用,但是容易造成变量污染,局部变量仅在局部作用域内有效,不可以重复使用,不会造成变量污染。
2.闭包缺点
闭包导致内存泄漏,因为闭包就是能够访问外部函数变量的一个函数,而函数是必须保存在内存中的对象,所以位于函数执行上下文中的所有变量也需要保存在内存中,这样就不会被回收,如果一旦循环引用或创建闭包,就会占据大量内存,可能会引起内存泄漏。
补充:什么是内存泄漏?
每个浏览器会有自己的一套回收机制,当分配出去的内存不使用的时候便会回收;内存泄露的根本原因就是你的代码中分配了一些‘顽固的’内存,浏览器无法进行回收,如果这些’顽固的’内存还在一直不停地分配就会导致后面所用内存不足,造成泄露。
避免内存泄漏
1. 减少不必要的全局变量,使用严格模式避免意外创建全局对象。
2. 在使用完数据后,及时解除引用(闭包中的变量,dom的引用,定时器清除)
3. 组织好你的逻辑,避免死循环等造成的浏览器卡顿,崩溃问题。
四、闭包的应用场景
封装功能时(需要使用私有的属性和方法),函数防抖、函数节流、函数柯里化、给元素伪数组添加事件需要使用元素的索引值。
总结
本文主要简单的介绍了闭包的概念、优缺点、应用场景