闭包个人理解

126 阅读1分钟

产生闭包的原因

根据词法作用域规则,内部函数总是能够访问到外部函数的变量。当外部函数执行完毕出栈时,内部函数用到的变量和函数不能被销毁,把这些函数和变量称为外部函数的闭包

使用场景

  1. 模仿块级作用域
// ES6之前没有块级作用域,可以使用闭包模拟
for (var i = 0; i < 5; i++) {
  (function closure(j) {
    setTimeout(() => {
      console.log(j)
    }, 0)
  })(i)
}
  1. 创建私有变量,如commonjs模块化
function privateVariable() {
  let _name = 'jack';
  return {
    getName() {
      return _name;
    }
  }
}

let obj = privateVariable();
console.log(obj.getName())  // 'jack'

tips

  • 函数编译阶段即可确定是否存在闭包,如果内部函数不依赖外部变量和方法,就不会形成闭包。
  • 闭包单独存放在上,只有内部函数可以读写
  • 使用闭包要谨慎,防止内存泄漏