函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起构成闭包(closure)。也就是说,闭包可以让你从内部函数访问外部函数作用域。在 JavaScript 中,每当函数被创建,就会在函数生成时生成闭包。
在闭包中有这两种使用方式,根据MDN所说的
函数和对其周围状态的引用捆绑在一起构成闭包
- 在返回一个函数时,他所使用的变量是根据函数定义时所在位置向上寻找.并不是在执行的时候
// 函数作用返回值
function create () {
const a = 100
return function () {
console.log(a)
}
}
const fn = create()
const a = 200
fn() // 100
// 函数作为参数返回
function print (fn) {
let a = 200
fn(a)
}
let a = 100
function fn () {
console.log(a)
}
print(fn) // 100
- 由于他能读取另一个作用域的变量,所以常常使用它来隐藏变量
// 闭包隐藏数据, 只提供 API
function creatCache() {
const data = {} // 闭包中的数据, 被隐藏不被外界访问
return {
set: function (key, val) {
data[key] = val
},
get: function (key) {
return data[key]
}
}
}
const c = creatCache()
c.set('a', 100)
console.log(c.get('a'))
- 注意点
- 闭包会将函数及变量都存在内存中,对于内存消耗很大,所以不能滥用闭包