闭包

86 阅读2分钟

什么是闭包

函数和其周围的状态(词法环境)的引用捆绑在一起形成闭包。 可在另一个作用域中调用一个函数的内部函数并访问到该函数的作用域中的成员。

闭包的本质: 函数在执行的时候会放到一个执行栈上当函数执行完毕之后会从执行栈上移除,==但是堆上的作用域成员因为被外部引用不能释放,== 因此内部函数依然可以访问外部函数的成员。

闭包有3个特性:

  1. 函数嵌套函数
  2. 函数内部可以引用函数外部的参数和变量
  3. 参数和变量不会被垃圾回收机制回收
function makeSalary(base) {
  return (performance)=>base+performance
}

let salaryLevel1 = makeSalary(12000)
let salaryLevel2 = makeSalary(15000)

console.log(salaryLevel1(2000)); //14000
console.log(salaryLevel2(5000)); //20000
//是指有权访问另一个函数作用域中的变量的函数

function MyObject(name, message) {
    this.name = name.toString();
    this.message = message.toString();
}

(function() {
    this.getName = function() {
        return this.name;
    };
    this.getMessage = function() {
        return this.message;
    };
}).call(MyObject.prototype);

优势

  1. 保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突
  2. 在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存)
  3. 匿名自执行函数可以减少内存消耗

劣势

  1. 其中一点上面已经有体现了,就是被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null;
  2. 其次由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响