闭包到底是什么?

417 阅读2分钟

「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

前言

大家好,我是cv竹叶,相信大家对JavaScript闭包熟悉但又陌生,也许在工作中就用过,或面试经常被问到,但是就是说不清楚什么是闭包,今天就让我们来了解了解,什么是JavaScript闭包吧!

闭包

js的执行机制

首先我们需要了解执行代码的环境,当代码在JavaScript中运行时,js会执行上下文查找变量和变量的作用域。

变量可以在作用域内调用到全局的变量,但是不同作用域内的变量不能直接调用。

var a = 1,b = 2;
function closure1(){
    let c = 3;
    console.log(a+b+c);
}
function closure2(){
    console.log(a+b+c);
}
closure1();//6
closure2();//c is not defined

闭包的简单解释

说到闭包,你可以理解为,一个书包里面装有小包,而书包可以随时带走移动。

当你需要用到书包里面东西的时候,就需要先打开书包,才能打开书包里面的小包,此刻小包就是闭包。

function Bag(){//书包
    var a = 1,b = 2;
    function smallBag(){//小包
        let c = 3;
        return a+b+c;
    }
    return smallBag;
}

闭包的应用

闭包应用场合主要是:创建私有的函数方法和变量,他们之间互不影响,且函数外的无法访问这些方法和变量。也就是平时提到的局部变量像let、const

闭包的使用,可以大大减少了全局变量的使用,增强了网页的安全性,防止被恶意传入变量改变原有的变量!

如下面的闭包例子,闭包外的无法对num值进行修改,提高了安全性!

//计算num值
var countNumber = (function(){
  var num = 0;
  return function(){
    return ++num;
  };
})();

闭包的缺陷

通常,函数的作用域及其所有变量都会在函数执行结束后被销毁。但是,在创建了一个闭包以后,这个函数的作用域就会一直保存到闭包不存在为止,就是常驻内存会增大内存使用量,并且使用不当很容易造成内存泄露。

如果不是因为某些特殊任务而需要闭包,在没有必要的情况下,在其它函数中创建函数是不明智的,因为闭包对脚本性能具有负面影响,包括处理速度和内存消耗。

如何销毁闭包呢?

当它不被任何其他的对象引用的时候,会自动销毁,或者我们也可以手动释放对象引用销毁!

var man = Bag();
man = null;//取消引用

结言

希望大家都对闭包有所了解了。

最简洁的表达是最清晰的解释,如果有帮到你,就点了个赞叭~