美文网首页
理解js中的闭包

理解js中的闭包

作者: o0ther | 来源:发表于2018-03-24 16:38 被阅读0次

    闭包是什么

    保留局部变量不被释放的代码块,称为一个闭包

    在js中,变量的作用域属于函数的作用域,由于函数在执行完毕后就会被清理,内存也会被回收,但是由于闭包是建立在函数内的子函数,其可以访问上级作用域的原因,即使上级函数执行完,作用域也不会随之销毁,这时的子函数,便拥有了访问上级作用域中的变量的权限,即使上级函数执行完后作用域内的值也不会随之销毁。

    闭包的作用

    知道了闭包是什么,那么闭包到底能做些什么呢?

    关于闭包,阮一峰这样说道:闭包就是能够读取其他函数内部变量的函数。在Javascript语言中,只有函数内部的子函数才能读取局部变量,可以把闭包简单的理解成“定义在一个函数内部的函数”。

    本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

    来看一个例子:

    function f(){
        let a = 999;
        function printNum() {
            console.log(a);
        }
        return printNum
    }
    let a = f();
    a()// 999
    

    上面这个例子反映出了闭包的一个作用:可以访问函数内的变量。
    在js中,函数就相当于一个黑盒子,从外界无法访问函数内部的变量,但通过闭包就可以实现这样的操作。
    上面的代码就形成了一个闭包,在函数f内定义了一个变量a和一个函数printNum,printNum函数引用了函数f中定义的a,f函数又将printNum函数return了出去,这样在函数外部也可以访问到f函数内的a变量,由于printNum函数保持着对a的引用,因此a这个变量不会被销毁。
    通过以上的例子,我们可以总结出闭包的一些特点:
    1.持久化函数内的变量
    2.将函数内部与外部连接起来

    利用闭包

    既然知道了闭包的特点,我们怎么利用它呢,这里举两个例子
    1.设置缓存
    既然可以持久化变量,我们不妨可以将这个变量用作一个缓存,来存储一些东西

    cosnt cache = (function() {
      const store = []
      return {
        get = function(key) {
          return store[key]
        },
        set = function(key, value) {
          store[key] = value
        }
      }
     }())
    cache.set('a', 10)
    cache.get('a')
    

    上面的例子定义了一个store,它一直被引用,不会被销毁
    2.保护变量
    假如有个变量a,很重要,并且在对这个变量进行操作的时候要注意其不能为负数,这时候可以用闭包

    cosnt foo= (function() {
      const a= 0
      return {
        add= function(num) {
          a+=num
        },
        reduce= function(num) {
          a -= num
          if(a < 0) {
              // 操作
           } else {
              // 操作
           }
        }
      }
     }())
    foo.add(3)
    foo.reduce(2)
    

    上面的代码形成了闭包,防止在外部操作a变量时使a变量的值超出范围

    闭包需要注意的地方

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

    相关文章

      网友评论

          本文标题:理解js中的闭包

          本文链接:https://www.haomeiwen.com/subject/ibwzqftx.html