形如下面就是闭包,在通常情况下在makeFn()执行完毕时 msg会被释放,我们不能通过执行内部的匿名函数来访问到它,而这压样执行fn() (return的匿名函数) 却能访问到msg,是因为外部作用域对msg有引用
function makeFn(){
let msg='hello'
return function (){
console.log(msg);
}
}
let fn = makeFn() // fn是 被return的匿名函数
makeFn()()//形同fn()
闭包本质,函数在执行的时候会放到执行栈上当函数执行完毕之后会从执行栈上移除,但是堆上的作用域成员因为被外部引用不能释放,因此内部函数依然可以访问外部函数的成员
闭包好处:为延长了外部函数内部变量的作用范围
个人理解:例如,makeFn函数在执行的时候,字符串(非长)存在栈中,栈中的数据在函数执行完毕是会被销毁的。但是因为msg为被捕获变量(如下),在js中被捕获变量存在堆中,所以我们还是能访问到。因此我们在外部作用域的fn()中还可以访问到makeFn()中的变量。
被捕获变量
被捕获变量就是局部变量的反面:在函数中声明,但在函数返回后仍有未执行作用域(函数或是类)使用到该变量,那么该变量就是被捕获变量。