闭包closure

在需要重用变量且变量不被篡改时,需要用闭包。因为全局变量易被篡改,而局部变量在函数被调用之后会自动释放,下一次再调用此函数时会重新自动声明该变量,不可被重用。所以这个时候需要一个特殊的作用域闭包也就是closure。

举一个简单的栗子:function parent(){

        var Money=100;

        return function(Spent){

              Money-=Spent;

              console.log(Money);

    }

}

var child=parent();

child(8);

执行步骤为:

1.定义外层函数parent()

2.声明外层函数变量Money

3.在外层函数parent()中返回带有形参的匿名函数

4.执行外层函数parent()并把返回的匿名函数赋值给变量child

5.调用child(Spent)也就是调用内层函数

结果:在child(Spent)被调用的时候,scope chain中会包含三级作用域:local、closure、global。程序执行时会依次从距离近的local开始找变量到距离远的global。

(因为外层函数把自己的变量给了内层函数,放在外层函数为内层函数新开辟的特殊作用域闭包也就是closure里)

多次执行child(Spent)也只会执行步骤5,反复执行内层函数(多了一个外层函数的变量)

闭包的缺点:比普通函数占有更多的内存,且不会自动释放。

*主动释放:child=null //释放内层函数及闭包。

*只有调用child(Spent)的时候才会形成闭包。

*(一次性生出的多个内层函数,共用同一个变量。)其他题

*js缺陷:未声明的变量会自动在global里生成全局变量,即使在函数里写未声明变量,也依然会自动生成全局变量。而这样的全局变量因为是从函数里生成,也会和return里的函数共用一个变量。

你可能感兴趣的:(闭包closure)