什么是闭包?用途及缺点

189 阅读2分钟

什么是闭包

闭包:如果函数内的变量根据语法作用域,要引用到函数外的变量,那么这个变量就会被保存起来,像放进一个背包一样跟随着函数的定义.他的特点是:

  1. 随着函数的定义而存亡,不随外部环境的灭亡而灭亡
  2. 保存不同的词法环境
        function saveName(name) {
            return () => {
                alert(name)
            }
        }
        let getName1 = saveName('deibo')
        let getName2 = saveName('tutu')
        getName1()
        getName2()

运行上面的代码,可以发现getName1()()和getName1()的返回值分别是'deibo'和'tutu'.这说明在创建箭头函数时保存了不同的词法环境

闭包的用途

根据闭包的特点,可以用来做数据隐藏和封装,如:

1.从外部访问局部变量

function fn1(){
let name='tutu'
return function fn2(){
return name
}}
let fn3 = fn1()
fn3()
//  fn3返回的值就是局部变量name的值'tutu'

2.私有方法

如下,fn2成为了obj的私有方法,只能通过obj.fn3()调用

        function fn1() {
            let name = 'tutu'
            function fn2() {
                return 'only fn3'
            }
            return {
                account: name,
                fn3: function () { return fn2() }
            }
        }
        let obj = fn1()
        console.log(obj.fn3());
        //  打印了'only fn3'

闭包的缺点

影响性能,因为更多的闭包,更多的函数,更多的内存

为了保存不同的环境状态会不断地创建新的函数,然而函数的定义却是相同的.所以如果不是某些特定任务需要使用闭包,在其它函数中创建函数是不明智的,因为闭包在处理速度和内存消耗方面对脚本性能具有负面影响。

例如,私有方法中的例子,如果用这种方式创建对象,每次创建对象都会声明新的函数,会占用更多的内存.所以如果不是特殊考量,应该用prototype的方法.