首先我们先来看一段代码

从上面的代码可以看出js都有一个特性特性,局部方法可以访问外部父类方法的属性,也就是说,子类或子方法可以访问父类的资源。

我们再来看一段代码

为什么我们打印出来的是undefined?因为子方法的变量作用域仅仅是子方法的范围,外部是无法获取到的。那么js中是如何获取字方法里面的值呢?我们来看下面的代码

在外部无法获取到funOne内部的局部变量,但是funOne内部的局部方法funTwo却可以获取到,因此 返回一个funTwo的引用,这样在外部通过这个funTwo就可以获取到funOne的内部变量。而这个方法内的局部方法funTwo就叫做闭包。简单的总结下有权访问另一个函数作用域内变量的函数都是闭包。

为什么要用闭包

我们知道,js的每个函数都是一个个小黑屋,它可以获取外界信息,但是外界却无法直接看到里面的内容。将变量 myname放进小黑屋里,除了funOne函数之外,没有其他办法能接触到变量myname,而且在函数funOne外定义同名的变量myname 也是互不影响的,这就是所谓的增强“封装性”。

闭包的用途

闭包可以用在许多地方。它的最大用处有两个,一个是前面说到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中,不会在funOne调用后被自动清除。

为什么会这样呢?原因就在于funOne是funTwo的父函数,而funTwo被赋给了一个全局变量,这导致funTwo始终在内存中,而funTwo的存在依赖于funOne,因此funOne也始终在内存中,不会在调用结束后,被回收。好比一个餐厅,盘子总是有限的,所以服务员会去巡台回收空盘子,但还装着菜的盘子他怎么敢收?

注意!!

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

(2) 闭包会在父函数外部,改变父函数内部变量的值。所以,,不要随便改变父函数内部变量的值。

常见缺陷

函数带()才是执行函数单纯的一句 var myname =funOne; 是不会打印的,后面接一myname (); 才会执行函数内部的代码。

总结

其实很多的方法都是给予闭包像redux 中的store就是用闭包和观察者模式来完成的,闭包应用的地方很多也很广泛,可以和很多的东西搭配,所以我们的路还有很长,这只是一个开始(未完待续。。。)

浅谈对JavaScript闭包的理解相关推荐

  1. 浅谈对js闭包的理解

    闭包就是能够读取其他函数内部变量的函数.由于在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成"定义在一个函数内部的函数".在本质上,闭包是将函数内 ...

  2. swift 引用其他类_浅谈swift中闭包修饰符 weak?unowned? 或什么都不用

    浅谈swift中闭包修饰符 weak?unowned? 或什么都不用 平常的开发中,clourse是我们iOSr绕不过去的坎儿. 苹果本身也很重视闭包,像之前的一些老的target-action类型的 ...

  3. Javascript闭包简单理解

    Javascript闭包简单理解 原文:Javascript闭包简单理解 提到闭包,想必大家都早有耳闻,下面说下我的简单理解. 说实话平时工作中实际手动写闭包的场景并不多,但是项目中用到的第三方框架和 ...

  4. 浅谈 我对 技术 的理解

    文章目录 1.浅谈 我对 技术 的理解 1.1 技术 是 什么? 1.2 技术的 两个 核心 构成 要素 1.2.1 知识 层面 1.2.2 智慧 层面(思考 层面) 1.3 技术 很难?学不明白? ...

  5. 关于Javascript闭包的理解

    一.什么是闭包? "官方"的解释是:所谓"闭包",指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 相 ...

  6. 谈一谈对JS闭包的理解

    个人觉得理解闭包,首先要理解以下几个概念. 1.函数的作用域和作用域链 js不像java等其他类语言,它并不存在块级作用域,取而代之的是函数作用域,另一个变量作用域是全局作用域. 函数的作用域:变量在 ...

  7. javascript闭包的理解

    javascript闭包是javascript的难点,很多人对js闭包不是很理解,我对js闭包一开始也是云里雾里,我刚刚进兴安得力的时候,做的转正试题中就有一个对闭包理解的题目.如何理解javascr ...

  8. JavaScript闭包函数理解

    JavaScript闭包 一.变量的作用域: 要理解闭包,首先必须理解JavaScript特殊的变量作用域.      变量作用域无非就是两种:全局变量 和 局部变量.       JavaScrip ...

  9. 浅谈对seo概念的理解

    个人认为与微信一样,搜索引擎有固定的用户群体,有人有流量的地方,就存在商机或者利益,seo的概念就是搜索引擎优化,其目的是在搜索引擎中获得精准用户,获得流量.从更深层次方面看,利用seo做自然排名获得 ...

最新文章

  1. Linux下的C#连接Mysql数据库
  2. php linux脚本文件,Unix/Linux中如何直接执行PHP脚本文件?
  3. 美国计划让“人工智能”去搜寻外星人!
  4. VTK修炼之道53:图形基本操作进阶_多分辨率策略(模型细化的三种方法)
  5. IOPS、带宽(band width)、吞吐量 (throughput)
  6. 前端学习(1986)vue之电商管理系统电商系统之建立新分支
  7. python 中BeautifulSoup入门
  8. 【TensorFlow】TensorFlow函数精讲之tf.contrib.layers.flatten()
  9. 在自己的电脑上搭建服务器(可供对外访问)
  10. canvas刷新_【前端冷知识】Canvas 滤镜的性能优化
  11. 智能机器人建房子后房价走势_日本房价走势分析:房产投资是否“未来可期”?...
  12. 题目1080:进制转换(任意进制直接转换方法)
  13. gx works2 存储器空间或桌面堆栈不足_2020淮北Gx螺旋输送机价格厂家出售
  14. nrf24l01无线模块c语言程序,NRF24L01 无线通信模块使用
  15. RUOK的完整形式是什么?
  16. 毕业两年做到测试经理的经历总结【转】
  17. php-Study1
  18. 鸿蒙 OS 2 升级用户破千万!(1000+企业共建鸿蒙生态)
  19. 一篇工作调动时的旧文
  20. 设计模式--依赖倒转原则

热门文章

  1. Oolong and Gnoloo
  2. Python架构(一)
  3. Android Studio 生成 ButterKnife 注入的插件
  4. 五个你绝不可忽视的HTML5特性
  5. postMan下使用xdebug
  6. Win2008 R2 IIS7.5+PHP5(FastCGI)+MySQL5环境搭建教程
  7. j2ee之原生AJAX
  8. Apache Kylin的核心概念
  9. js动态获取时间的方式
  10. powershell