一、什么是闭包?
作用域应用的特殊情况(有两种):
函数作为参数被传递
函数作为参数被返回
1.函数作为参数被传递:
function print(fn){
let a = 200
fn()
}
let a = 100
function fn(){
console.log(a)
}
print(fn)
//100
2.函数作为参数被返回
function create(){
let a = 100
return function(){
console.log(a)
}
}
let fn = create()
let a = 200
fn()
//100
3.自由变量
什么是自由变量?
当前作用域没有定义但是使用了,需要我们去沿着作用域链查找的变量。
自由变量的查找规则?
在函数定义
的地方,向上级作用域查找,而不是执行的地方!!!
二、实际开发过程中闭包的应用
比如隐藏数据(做一个简单的cache工具)
function createCache(){
let data = {} //闭包中的数据,被隐藏,不被外界访问
return {
set(val, key){
data[val] = key
},
get(key){
return data[key]
}
}
}
let c = createCache()
c.set('a', 100)
console.log(c.get('a'))
//100(这样就只能通过c.get和c.set来访问和设置data, 而不能再函数外随意修改和获取data的值)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。