闭包是javascript的一个难点也是优点,许多高级的应该都有用到闭包
在了解闭包前我们先要了解作用域
变量的作用域
变量的作用域有两种
- 全局变量
- 局部变量
全局变量的声明,函数内部都可以读取这个变量
let a = 1
function fn(){
console.log(a)
}
fn() // 打印出了1
function fn (){
let a = 1
}
console.log(a) //error,因为a没有定义
如果变量声明在函数内部(或者说在一个label中),那就外部函数不能读取到这个变量。
读取函数内部变量
如果我们需要读取到这个函数作用域内的变量,我们就要在这个函数内部在加入一个函数
function fn (){
let a = 1
console.log(a)
}
fn() // 打印出了1
比如
function fn(){
let a =1
function fn1(){
console.log(a) // 打印出了1
}
}
fn() // 返回值为undefined
闭包
上边我们说的fn1就是闭包。简单来说就是函数可以读取访问到外部变量
function fn(){
let a =1
function fn1(){
console.log(a) // 打印出了1
}
return fn1()
}
fn() // 打印出了1
只需要将fn函数返回值为fn1()就可以打印出1.
闭包好处
-
函数内部可以读取外部变量
javascript中的规定就是内部函数可以访问读取外部变量,反之就不行,
-
闭包会使得函数中的变量都被保存在内存中
因为这个机制的原因,所以变量不会被垃圾回收机制回收,闭包的数量越多,内存占用越大,导致闭包在处理速度和内存消耗方面对脚本性能具有负面影响。
-
避免变量污染