闭包使用

74 阅读3分钟

6a.jpg 闭包应用场景有:1、采用函数引用方式的setTimeout调用;2、小范围代替全局变量;3、有权访问私有变量和私有函数的公有方法。

函数外部无法访问函数内部的局部变量,但函数内部的函数可以访问本函数内的局部变量,故通过闭包实现函数外部访问函数内部局部变量。但容易造成内存泄漏,应当谨慎使用。

闭包的使用场景

【1】、采用函数引用方式的setTimeout调用

【2】、小范围代替全局变量

【3】、访问私有变量的特权方法? 特权方法指的是有权访问私有变量和私有函数的公有方法, 私有变量包括:

(1)、局部变量

(2)、函数的参数

(3)、函数内部定义的其他函数(闭包)

一、什么是闭包

闭包说的通俗一点就是可以在函数外部访问到函数内部的变量。因为正常

情况下函数外部是访问不到函数内部作用域变量的,作用域分为了全局.函数

级.块级作用域.

   let obj = {
        name:'哈哈哈',
        fn:function(){
            return this.name
        }
    }
obj.fn();
// 释放obj的内存
obj = null;

表象判断是不是闭包:函数嵌套函数,内部函数被return内部函数调用外层函数的局部变量

  function foo(){
    var local = 1;
    function bar(){
      local++;
      return local;
    }
    return bar;
  }
  var func = foo()
  func()

把下面三行代码放在一个立即执行函数中

    var item = '变量'
    function foo(){ // foo  ---函数
        console.log(item);
        // 在函数内部可访问的item变量
    }
    

三行代码中,有一个局部变量item,有一个函数foo,foo里面可以访问到item变量。

这就是一个闭包:「函数」和「函数内部能访问到的变量」的总和,就是一个闭包!!!

二、闭包的作用

闭包常常用来「间接访问一个变量」。换句话说,「隐藏一个变量」。

三、使用闭包的注意点

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

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

优缺点

优点:可以隔离作用域,不造成全局污染,可以让垃圾回收机制不会回收这个变量,让他能一直被标记为被引用。

缺点:由于闭包长期驻留内存,则会导致大量内存永远不会被释放。

如何释放内存:将暴露外部的闭包变量置为 null