如何理解闭包?

86 阅读2分钟
  • 我们在学习闭包的过程中可能会遇到一些问题和难以理解的地方,究竟什么是闭包,闭包有什么用,该如何使用闭包?

闭包是什么?

  • 通俗点讲:闭包其实就是定义在一个函数内部的函数。

  • 闭包可以在外部调用一个函数的内部函数并访问到该函数的作用域中的变量

  • 具体来说就是:在函数a的内部返回了另一个函数b,在b中引用了a作用域中的变量,这时就形成了闭包。

  • 例:

    function a(x) {
        return function b(y) {
            return x + y
        }
    }
    const add_10 = a(10)
    const res = add_10(1)
    console.log(res);   //11
    

理解闭包

  • 从上例来说,调用a函数返回了一个新的函数b。此时在外界调用a函数并传入参数x=10时,x是a函数的内部作用域中的变量,按理说在外界是无法访问的,但是a(10)的运行结果是返回了一个新的函数b,并且这个函数b被保存到了add_10中。此时对a函数的调用已经结束,a和它内部的变量本应该都从内存中清除。但由于add_10中用到了x这个变量,因此在函数a被清除时x不会被一起清除掉,而是被缓存在了内存中。

  • 执行栈内函数完成后出栈,而函数内部的变量不会从堆内存中清除(因为外界有引用)。

闭包的意义

  • 在JavaScript运行的过程中,函数在调用时会存放在执行栈中。每调用一个函数。就将函数进行入栈,执行结束后会将函数进行出栈(大概就是从内存中清除了这个函数)。

  • 函数出栈后其内部的变量因为失去了引用也会被很快地清除掉。而在闭包中,因为函数内部返回了一个新的函数,而这个新函数对函数内部的变量有引用,因此这个变量将不会被清除,由此外界也可以通过这个函数来访问到这个变量。