浅谈闭包

94 阅读1分钟

闭包是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中的规定就是内部函数可以访问读取外部变量,反之就不行,

  • 闭包会使得函数中的变量都被保存在内存中

    因为这个机制的原因,所以变量不会被垃圾回收机制回收,闭包的数量越多,内存占用越大,导致闭包在处理速度和内存消耗方面对脚本性能具有负面影响。

  • 避免变量污染