闭包是什么?
闭包是 JS 的一种语法特性。
闭包 = 函数 + 自由变量
对于一个函数来说,变量分为:全局变量、本地变量、自由变量
let count
function add (){ // 访问了外部变量的函数
count += 1
}
把上述代码放在一个函数中,并用return将function返回,这就是闭包,也就是把上述代码放在「非全局环境」里
const add2 = function (){
var count
return function add (){ // 访问了外部变量的函数
count += 1
}
}()
使用场景
- 创建私有变量
- 延长变量的生命周期
解决了什么问题:
- 避免污染全局环境。(因为用的是局部变量)
- 提供对局部变量的间接访问。(因为只能 count += 1 不能 count -= 1)
- 维持变量,使其不被垃圾回收。
优点:
简单,好用。
缺点:
闭包使用不当可能造成内存泄露。
注意,重点是「使用不当」,不是闭包。
「闭包造成内存泄露」这句话以讹传讹很多年了,曾经旧版本 IE 的 bug 导致的问题,
function test() {
var x = {name: 'x'};
var y = {name: 'y', content: "-----这里很长,有一万三千五百个字符那么长----" }
return function fn() {
return x;
};
}
const myFn = test() // myFn 就是 fn 了
const myX = myFn() // myX 就是 x 了
// 请问,y 会消失吗?
对于一个正常的浏览器来说,y 会在一段时间后自动消失(被垃圾回收器给回收掉)。
但旧版本的 IE 并不是正常的浏览器,所以是 IE 的问题。
注意事项
如果不是某些特定任务需要使用闭包,在其他函数中创建函数是不明智的,因为闭包在处理速度和内存消耗方面对脚本性能具有负面影响。