美文网首页
理解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中的闭包

    闭包是什么 保留局部变量不被释放的代码块,称为一个闭包 在js中,变量的作用域属于函数的作用域,由于函数在执行完毕...

  • js 中 闭包 的理解

    定义:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(函数),因而这些变量也是该表达式的一部分 个人理解:如...

  • 理解js中的闭包

    使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量...

  • 一分钟理解js闭包

    一分钟理解js闭包,关于js闭包的内容介绍了很多,本文带着大家快速理解什么是js闭包,感兴趣的小伙伴们可以参考一下...

  • 一分钟带你弄懂闭包

    一分钟理解js闭包,关于js闭包的内容介绍了很多,本文带着大家快速理解什么是js闭包,感兴趣的小伙伴们可以参考一下...

  • 什么是闭包?几分钟告诉你

    一分钟理解js闭包,关于js闭包的内容介绍了很多,本文带着大家快速理解什么是js闭包,感兴趣的小伙伴们可以参考一下...

  • 一分钟带你弄懂闭包

    一分钟理解js闭包,关于js闭包的内容介绍了很多,本文带着大家快速理解什么是js闭包,感兴趣的小伙伴们可以参考一下...

  • 快速理解js中的闭包

    今天研究了一波js中的闭包,分享一下自己的理解。 一、变量的作用域 要理解闭包,首先必须理解Javascript特...

  • JS闭包入门

    最近有看到朋友的面经里提到的JS闭包的问题,就想研究研究,以下是我对JS闭包的简单理解。 到底什么是JS闭包? 定...

  • JS闭包大结局(JS闭包系列3)

    在上一篇中再谈JS闭包(JS闭包系列2),我详细的介绍了JS中的变量作用域相关的概念,结合第一节关于JS闭包(JS...

网友评论

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

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