闭包是一个函数和其作用域对象组成的结果,使用闭包能够访问函数作用域中的变量。从代码形式上看闭包是一个做为返回值的函数,如下代码所示:

    1. <script>
    2. function foo() {
    3. let i = 0;
    4. // 函数内部分函数
    5. function bar() {
    6. console.log(++i);
    7. }
    8. // 将函数做为返回值
    9. return bar;
    10. }
    11. // fn 即为闭包函数
    12. let fn = foo();
    13. fn(); // 1
    14. </script>

    面试题:

    1. function fn1() {
    2. let i = 1
    3. function fn2() {
    4. console.log(i)
    5. i++
    6. }
    7. return fn2
    8. }
    9. let fanhuizhi = fn1()
    10. fanhuizhi() // 1
    11. fanhuizhi() // 2
    12. fanhuizhi() // 3

    总结:
    闭包:一个作用域有权访问另外一个作用域的局部变量。
    好处:可以把一个变量使用范围延伸

    1. 闭包本质仍是函数,只不是从函数内部返回的
    2. 闭包能够创建外部可访问的隔离作用域,避免全局变量污染
    3. 过度使用闭包可能造成内存泄漏(内存占用过多)

    现在闭包用的非常少了。因为有块级作用域。
    注:回调函数也能访问函数内部的局部变量。