对于闭包(colsure)的一些理解

158 阅读2分钟

概念: 够读取其他函数内部变量的函数,且定义函数的作用域和执行函数的作用域不一致(开发中的理解)

举个例子

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函数作用域外部访问。只能通过返回函数修改。

用途

  1. 让一些变量始终保存在内存中,延长局部变量的寿命
  2. 控制变量的访问。只能通过闭包函数操作变量.或者使一作用域访问其他作用域的变量
//缓存数据,控制访问
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))

弊端

由于闭包函数中引用的变量会一直存储于内存中,使用不合理,会造成内存泄露