function fn() {
let num = 10 // 只能在函数里面使用,外面看不到---- 数据私有化
console.log('外');
return function g() {
num++
console.log(num);
}
}
const res = fn()
fn()//外
res//外
res()//11
res()//12
fn()()//11 外
fn()()//11 外
闭包的作用: 可以让函数外面访问函数内部的变量
现有需求,通过外部访问闭包内层函数,让num每次访问后加一
方法:
1.声明一个变量res = fn(),此时res就为一个函数(可以理解闭包的外层函数)
2.访问内部函数g().我们直接可以使用 res + ()的写法 即 res()来直接访问内层函数g()(调用内层函数g())
原理:
这里的res()的写法,是表示通过给res赋值为fn()这个函数,让res可以直接看成是这个闭包函数的外层函数,想要每次直接访问内层函数,只需要给外层函数加括号,就能直接访问内层函数.
不同的思路:
首先声明这个思路并不能满足上面的需求.但是很接近,容易混淆
提问:我们既然把fn()的值 赋给了res,(res=fn())那是不是代表 res下面的用法可以完全被fn()代替呢?即下面的res()可以用 fn()()代替呢?
回答:不可以!
原因:两者表示的含义完全不同.
fn()()表示 每一次都会先调用外层函数fn()再调用内层函数g(),不管下面写多少次fn()(),num的值每次都会先调用一次外层函数fn()被重新赋值为10,再调用g() 为11,永远只能打印 '外' 和 11
res()这个代码表示它通过fn()这个外层函数,直接调用一次内层函数g(),跳过了每次都会重新调用外层函数fn(),再找内层函数g()的这个过程,所以不管res()写多少次,外层函数中的let num = 10只会声明一次,g()里面num的值会随着res()的使用次数不断累加