什么是闭包?闭包的作用是什么?.md

什么是闭包?闭包的作用是什么?

什么是闭包

Closure是函数有能力记住和访问变量的词法作用域, 在函数本身已经执行完成后。(数据持久性)

闭包出现的原因

由于js引擎的垃圾回收机制, 在执行我们的代码的时候,js维护着一个调用栈。在函数执行完成的时候,由垃圾回收机制去处理这个调用栈(调用栈内包含函数的词法作用域), 要销毁调用栈的时候,发现还存在引用。那么垃圾回机制就不处理它。这就导致这个函数的词法作用域保留了下来,也让该函数具有了数据持久性。有利也有弊,基于垃圾回收机制,如果你的闭包内存有大量数据, 那么它是不会被清除的, 这就需要我们自己手动的去处理它。

闭包的作用

  1. 私有化变量, 封装变化
  2. 构建块级作用域: 关于那道题setTimeout, 应该还有一种答案.虽然看起来比较麻烦,但是它可以跑
    1
    2
    3
    4
    5
    6
    7
    8
    console.log('方案3: setTimeout内闭包');
    for (let i = 0; i <= 3; i++) {
    setTimeout(((i) => {
    return () => {
    console.log(i);
    }
    })(i), i * 1000);
    }
  3. 函数式编程里的偏函数用到了闭包
    1
    2
    3
    4
    5
    6
    const addOperator = x => y => x + y;
    const add1Operator = addOperator(1);
    const add2Operator = addOperator(2);

    add1Operator(1); // 2
    add2Operator(1); // 3