<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>对常见闭包的理解</title>
</head>
<body>
<script type="text/javascript">
function fn1(){
var a = 2
function fn2(){
a++
console.log(a)
}
return fn2
}
var f = fn1()
f() // 3
f() // 4
</script>
</body>
</html>
自己对该闭包的理解:简单而言,fn1是外部函数,fn2是内部函数。在fn1执行时(15行),由于fn2提前声明,而声明内部函数时会产生闭包,因此此时闭包产生。
当执行到23行时,其实就是在fn1()中执行fn2(),因此a++,a由2变成3。因为执行fn1(),结束后返回的是fn2,而f后面有一个(),因此会执行fn2(),其实关键点在于22行(也可是说加上20行),让f指向了fn2,因此fn2就不会变成垃圾对象。
当执行到24行时,其实是在fn1()中再次执行一次fn2(),因此a再次++,a由3变成4。也就是说,只要不再次执行fn1(),闭包就不会结束,因此函数内的局部变量进行了延续。简单而言就是在同一个fn1()中多次执行fn2(),既然是在同一个fn1()中,那么fn1中定义的局部变量必然不会消失,因此看起来就是延长了局部变量的生命周期。