Web前端必做笔记之一:闭包(一)基本概念
<script>
// 我们先看看这个
let a = 10;
let b = 20;
function fun(){
let a = 30;
let c = 40;
function fun(){
let a = 50; //内部函数如果使用变量a,他会在当前的作用域下找,有没有a,如果有直接输出,如果在fun中输出b,没有b,就会在上一层找,在全局环境中没有找到,就会报"undefined",这就是作用域链
let d = 60;
}
}
// 闭包:函数嵌套函数,内部函数是闭包
function outerFun(){
let a = 10;
function innerFun(){
console.log(a);
}
return innerFun; //把这个闭包作为返回值返回才出来
}
//outerFun(),返回值是这个内部函数
let fun = outerFun(); //这里其实就是把innerFun赋值给fun
fun(); //10 为啥是输出10? 因为a是可以访问外部函数的变量
</script>
<script>
//正常情况下,函数执行完成,内部变量会销毁 (销毁:释放内存空间)
function fun(){
let a = 10;
console.log(a);
}
fun() //执行完成之后,函数里面的局部变量的内存空间就会被释放, 释放就是这个'a'没了
//再看这个
function outerFun(){
let a = 10;
function innerFun(){
console.log(a);
}
return innerFun;
}
let fun = outerFun(); //这个是执行完了,那里面的10销毁了吗,会发现没有。依然输出10,内存空间有这个变量
fun();
//闭包,内部函数没有执行完成,内部函数变量不会被销毁。
</script>
总结
1.作用域链:底层的函数使用变量时,会在当前作用域下找,若当前作用域下没有,会向上一层一层查找,直至找到全局环境,若全局环境也没有,则报错
2.闭包:函数嵌套函数,内部函数是闭包
3.正常情况下,函数执行完成,内部变量会销毁 (销毁:释放内存空间)
4.闭包,内部函数没有执行完成,内部函数变量不会被销毁。