关于 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 }