彻底理解js中的闭包
闭包是js的一个难点,是我们必须掌握的js高级特性,那么什么是闭包呢?它又有什么用呢?
我们都知道,js的作用域分两种,全局和局部,基于我们所熟悉的作用域链相关知识,我们知道在js作用域环境中访问变量的权利是由内向外的,内部作用域可以获得当前作用域下的变量并且可以获得当前包含当前作用域的外层作用域下的变量,反之则不能,也就是说在外层作用域下无法获取内层作用域下的变量,同样在不同的函数作用域中也是不能相互访问彼此变量的,那么我们想在一个函数内部也有限权访问另一个函数内部的变量该怎么办呢?闭包就是用来解决这一需求的,闭包的本质就是在一个函数内部创建另一个函数
我们首先知道闭包有3个特性:
了解闭包
+ 闭包的生成有三个必要条件(缺一不可)
1. 在函数 A 内部直接或者间接返回一个函数 B
2. B 函数内部使用着 A 函数的私有变量(私有数据)
3. A 函数外部有一个变量接受着函数 B
+ 形成了一个不会销毁的函数空间
①函数作为返回值
②间接的返回一个函数
闭包的特点(优点和缺点并存)
1. 延长了变量的生命周期
+ 优点: 因为执行空间不销毁, 变量也没有销毁
+ 缺点: 因为执行空间不销毁, 会一直存在在内存中
2. 可以访问函数内部的私有变量
+ 优点: 利用闭包函数可以访问函数内部的私有变量
+ 缺点: 执行空间不会销毁, 会一直存在在内存中
3. 保护私有变量(只要是函数, 就有这个特点)
+ 优点: 保护私有变量不被外界访问
+ 缺点: 如果向访问, 必须要利用闭包函数
闭包的函数的缺点 致命
+ 因为当一段内存空间中有一个不会被销毁的东西一直存在
+ 那么就会出现内存占用, 如果过多, 就会导致内存溢出
+ 那么结果就是 内存泄漏
闭包的作用
+ 就是当你需要延长变量的声明周期的时候
+ 或者你需要访问某一个函数内部的私有数据的时候
+ 你可以使用 闭包 函数来解决
+ 前提:
=> 如果有别的方法, 尽量不要使用闭包函数
=> 只有到没有招的时候, 我们在使用闭包函数
+ 闭包: 慎用