闭包是JS的语法特性
    函数+自由变量的组合形成闭包

    什么是自由变量?

    • 一个变量在当前作用域没有定义,但是被使用了
    • 向上级作用域一层一层依次寻找,直到找到为止
    • 如果到全局作用域都没找到,则报错 xx is not defined
    • JavaScript使用的是词法作用域(静态作用域),函数的作用域在定义的时候就被确定了,查找自由变量的时候是在函数定义的地方查找,而不是函数调用的地方查找

    闭包有两种表现形式

    • 函数作为参数被传递 ```javascript function print(fn) { let a = 200 fn() } let a = 100 function fn(){ console.log(a) }

    print(fn) // 100

    1. - 函数作为返回值被返回
    2. ```javascript
    3. function create() {
    4. let a = 100
    5. return function(){
    6. console.log(a)
    7. }
    8. }
    9. let fn = create()
    10. let a = 200
    11. fn() // 100

    闭包的作用:

    • 避免污染全局环境。(因为用的是局部变量)
    • 创建私有变量(隐藏变量),使其只能被间接访问
    • 延长变量生命周期,使其不被垃圾回收。

    闭包的缺点
    变量常驻内存,可能导致内存占用过多,影响页面性能