关于 JavaScript 闭包的理解

关于 JavaScript 闭包的理解

开宗明义:闭包就是一个披着函数外衣的对象——这个对象打包了那个函数和它的外层执行环境。

下面使用一个闭包套闭包的例子来证明这一点:

function foo() {
  let i = 0
  return function () {
    let j = 0
    i += 1
    return function () {
      i += 1
      j += 1
      console.log(`i=${i} j=${j}`)
    }
  }
}
// 此处用 c 表示闭包(closure)
let f1 = foo() // 产生第一个外层的闭包 c1 { i: 0 }
let f2 = foo() // 产生第二个外层的闭包 c2 { i: 0 }
let f11 = f1() // 产生 f1 执行后的闭包 c11 { c: c1, j = 0 } 此时的 c1 { i: 1 }
let f12 = f1() // 产生 f1 执行后的闭包 c12 { c: c1, j = 0 } 此时的 c1 { i: 2 }
f11() // f11 执行 c11 变为 { c: c1, j: 1 } 此时 c1 { i: 3 }
f11() // f11 执行 c11 变为 { c: c1, j: 2 } 此时 c1 { i: 4 }
f12() // f12 执行 c12 变为 { c: c1, j: 1 } 此时 c1 { i: 5 }
f2()() // 从 c21 { c: c2, j: 0 } c2 { i: 1 } 变为 c21 { c: c2, j: 1 } c2 { i: 2 }

 

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 关于 JavaScript 闭包的理解