关于闭包的理解

js闭包会把想要改变的属性隐藏在函数内,则外界完完全全是没有办法访问到那个属性的,只有在该函数返回的另一个函数中访问得到,这是由于js函数作用域链的缘故。
一般我们使用闭包不外乎几个原因:

  1. 将变量隐藏,防止外部访问,利用闭包作为唯一的操作数据的接口
  2. 减少全局变量的使用,而用闭包变量缓存数据

我们一般使用一个对象去接收也就是获取返回函数的引用,如下是多次调用原函数和使用对象接收的区别

  • 使用原函数
        let f = function(){
            let test = 0;
            return function(){
                console.log(++test)
            }
        }
        f()();  //1
        f()(); //1
        f()(); // 1 
  • 使用对象接收
        //用同一个变量去接收闭包返回的函数,在执行那个变量函数
        let f = function(){
            let test = 0;
            return function(){
                console.log(++test)
            }
        }
        let func = f();
        func();  //1
        func();  //2
        func(); //3

故多次执行原函数即多次执行重置变量的过程,并不能起到我们需要的缓存变量的功能,所以应该用一个对象获取原函数返回的函数。

注意,当返回的函数使用了这个属性时,该属性就不会被自动清除了,除非没有对象接收这个函数的引用了,这个函数和函数所形成的闭包也就会被一并销毁。具体方法就是将接收对象赋值为另一个对象(如空对象)或者null,则闭包就释放了。

        let f = function(){
            let test = 0;
            return function(){
                console.log(++test)
            }
        }
        let func = f();
        func();  //1
        func();  //2
        func(); //3
        
        func = null  //此时func对象已更换引用对象,上次执行的f()被回收
        
        //为了证明被回收,我们可以再将其引用回来,如下
        func = f();
        func();  //1
        func();  //2
        func(); //3
  

你可能感兴趣的:(关于闭包的理解)