闭包

  • 讲闭包首选要先说说函数作用域
  • 全局作用域只有一个,每个函数又都有作用域(环境)。
  • 编译器运行时会将变量定义在所在作用域
  • 使用变量时会从当前作用域开始向上查找变量
  • 作用域就像攀亲亲一样,晚辈总是可以向上辈要些东西
  • 作用域链只向上查找,找到全局 window 即终止,应该尽量不要在全局作用域中添加变量。
  • 函数被执行后其环境变量将从内存中删除,但是如果子函数被使用时父级环境将被保留。
  • 使用 let / const 可以将变量声明在块作用域中(放在新的环境中,而不是全局中)
  • 在 for 循环中使用 let / const 会在每一次迭代中重新生成不同的变量
  • 在没有 let / const 的历史中使用以下方式产生作用域
for (var i = 0; i < 10; i++) {
    (function (i) {
        setTimeout(() => {
            console.log(i);
        }, 500);
    })(i);
}
  • 闭包指子函数可以访问外部作用域变量的函数特性,即使在子函数作用域外也可以访问。如果没有闭包那么在处理事件绑定,异步请求时都会变得困难。
  • JS 中的所有函数都是闭包,闭包一般在子函数本身作用域以外执行,即延伸作用域
  • 闭包特性中上级作用域会为函数保存数据,从而造成的如下所示的内存泄漏问题
  • 解决方法就是手动清理不需要的数据
  • this 总是指向调用该函数的对象,即函数在搜索 this 时只会搜索到当前活动对象。
  • 有时候函数因为是在全局环境下调用的,所以 this 指向 window,这不是我们想要的。
  • 使用箭头函数解决这个问题