昨天又翻了翻闭包,好像又有了一点点的理解,所以一篇博客油然而生
闭包,大白话来说,就是外界跟内界打通了一条渠道,这里就不得不提到作用域,但是用正经的语言又是这样,一个函数的返回值也是一个函数,并且返回的这个函数在外面被调用,还使用了其父级的变量
作用域分为局部作用域和全局作用域,全局作用域就比较自由,没有限制,可以随时随地的发挥,而局部作用域就只能在自己的活动范围内活动,对于函数来说,可能作用域就是函数中,这个要看具体的情况进行具体的分析。
而闭包跟作用域的连接或者关系来说,就是在局部作用域中声明的变量是在全局拿不到的,闭包正式解决了这一大难题
在这里简单提一下全局变量和局部变量
<script>
function fn(){
let num = 1
console.log('num:',num); // num: 1 局部变量
}
fn()
// console.log(num); // 报错,全局拿不到局部变量
</script>
然后就会有人说,我想拿到fn()里面的num该咋办呢?众所周知,函数是有返回值的,所以我 return 不久可以了,如果你能想到这里的话,那很好,你很聪明,所以我就进行了下面的操作
<script>
function fn(){
let num = 1
return num
}
// fn()
// console.log(num); // 报错,全局拿不到局部变量
var num2 = fn()
console.log(num2); // 1
</script>
这样的确是拿到了num,但是如果我想写一个函数,每一次调用就使其+1,这个如何实现?
起初我是这样想的:
<script>
function fn(){
let num = 1
num++
return num
}
var f2 = fn()
console.log(f2);
console.log(f2);
console.log(f2);
console.log(f2);
</script>
看到结果的我不仅悄悄地摸了一下眼泪
这时候闭包又跳进我的脑子了
<script>
function fn() {
let num = 1
return function () {
num++
return num
}
}
var f2 = fn()
console.log(f2());
console.log(f2());
console.log(f2());
console.log(f2());
console.log(f2());
console.log(f2());
</script>
看到结果,感觉头发没少掉,可以了已经
嘿嘿,对于闭包,你是否有了简单的认识???