关于JS闭包-日常打卡(1)

140 阅读3分钟

闭包

今天在刷题的时候,看到了一个关于js闭包的问题,然后发现自己好像也是一知半解,后来面向百度了查了一下。

闭包是啥?

简单的来说就是我可以在一个函数里面用到它作用域之外的变量,那么这个变量和这个函数之间的环境就叫做闭包
举个简单的栗子
   var text = "外部变量";
   function foo(){
       console.log(text);
   }
   foo();//外部变量

上面这个就是一个简单的闭包 变量text是函数foo作用域之外的变量,我在foo函数里面调用了text.这个就是闭包

闭包的作用:

用的比较多的:
1.读取函数内部变量。
    在一些情况下,我们不太适合定义一个全局变量,所以我们得定义一个局部变量比较安全,但是局部变量别人怎么用呢
    这个时候得用闭包,举个栗子,假设我现在手头有笔现金巨款,放在家里总归是不太安全的,这个时候我想到了啥,放银行存起来,
    我存过之后,该怎么用呢,用银行卡来使用操作这笔钱。钱=变量,银行=函数,银行卡=闭包,我=使用者。
 function foo(){
    var money = 200;
    function bar(){
        return money;
    }
    return bar();
 }
 var func = foo();
 console.log(func());//200
 
2.变量始终保存在内存中,不会被垃圾回收机制回收(这个等我后面在说)
 function foo(){
    var money = 200;
    moneyAdd = function(){
        money +=10;
    }
    function bar(){
        return money;
    }
    return bar();
 }
 var func = foo();
 console.log(func());//200
 moneyAdd(); //调用方法存钱方法
 console.log(func());//210

在这段代码中,func实际上就是闭包bar函数。它一共运行了两次,第一次的值是200,第二次的值是210。这证明了,函数foo中的局部变量money一直保存在内存中,并没有在foo调用后被自动清除。 为什么会这样呢?原因就在于foo是bar的父函数,而bar被赋给了一个全局变量,这导致bar始终在内存中,而bar的存在依赖于foo,因此foo也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。

使用闭包时的注意点:

1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

结语

以上就是我参照网上的资料,加上自己的一些理解,后面也会及时补充其他的知识点。如果有什么问题,麻烦指点一下,我也会及时纠正的,谢谢