概念: 够读取其他函数内部变量的函数,且定义函数的作用域和执行函数的作用域不一致(开发中的理解)
举个例子
function builder(){
let name = '小明';
function operator (value){
name = value
}
return operator
}
const set = builder();
set('小红');
我们知道,只要当前上下文中的某些内容被当前上下文以外的东西引用,那么当前上下文是不能被释放的,上下文当中存储的变量等信息也保存下来了。
此处name在函数的作用域下,理应随着builder执行完成后EC(builder)(builder函数私有执行上下文)的销毁而回收。但由于返回函数的作用域引用了name,那么EC(builder)不会被销毁。
此外operator函数定义的作用域为EC(builder),而执行的作用域为EC(G)(全局执行上下文)。
此时闭包产生了,name无法在a函数作用域外部访问。只能通过返回函数修改。
用途
- 让一些变量始终保存在内存中,延长局部变量的寿命
- 控制变量的访问。只能通过闭包函数操作变量.或者使一作用域访问其他作用域的变量
//缓存数据,控制访问
function builder(){
const cache = {}
return function (key){
if(cache[key]){
//缓存中有数据直接返回
return cache[key]
}
//这里我们可以做一些复杂的操作,从其他地方获取数据
//const value = get()
//将得到的数据缓存
//cache[key] = value
return cache[key]
}
}
const op = builder();
op();
//高阶函数
//函数柯里化:将其变成了分批传入参数,而且参数每次只能传递一个(会让函数更具体一些)
const isTyping = function(typing){
return function(value){
return Object.prototype.toString.call(value) === `[object ${typing}]`
}
}
let isString = isTyping('String');
console.log(isString(`123`))
console.log(isString(123))
弊端
由于闭包函数中引用的变量会一直存储于内存中,使用不合理,会造成内存泄露