前言:闭包形成的条件,作用域嵌套,内部作用域引用外部作用域变量,形成变量常驻内存。
利用非函数嵌套创建一个闭包,上代码:
if (true) {
let a = 1
window.B = function () {
return ++a
}
}
console.log(B());
console.log(B());
console.log(B());
console.log(B());
console.log(B());
console.log(B());
//最后打印结果是:2,3,4,5,6,7
再看一个传统的经典闭包demo:
function a() {
var count = 1
return function b() {
count++
console.log(count);
}
b()
}
var c = a()
c()
c()
c()
c()
c()
c()
//打印结果:2,3,4,5,6,7
第一段代码没有使用函数嵌套的形式,同样实现了函数嵌套的结果,达到了延长外部作用域变量的声明周期的目的。
所以闭包的形成和是否使用函数嵌套没有关系,关键在于引用变量的环境是否有作用域嵌套。
补充:
- 闭包在内存里也是以对象的形式存在
- 闭包保存的变量对象也在执行上下文里
- 非函数嵌套形式形成的闭包无法在浏览器里查看到,但实践证明确实存在
- 形成闭包后和原先声明的变量已经没有关系了,闭包是对象,原有变量可能是数值