闭包(closure)

**概念:**有权访问另一个函数作用域中变量的函数
**作用:**延伸变量的作用范围
特殊点:
代码中的变量分为两种:全局变量和局部变量,全局变量可以提供给全局所用函数使用,而局部变量只能提供给当前函数使用,且仅在函数被调用时生成,函数执行完毕后立即销毁。而闭包则是一个特殊的函数,它可以访问另一个函数中的局部变量
解释示例:
function fn(){
var num = 10;
function fun(){
num++
console.log(num)
}
fun()
}
fn()
此时调用函数fn(),结果会是通过函数fun()得到返回值10;
思考:fun()函数中并没有定义变量num,num的定义是写在其上层函数fn()里面的,可以理解为是fn()的局部变量,但是fun()函数却进行了调用,这从局部变量的特点上来讲是不符合规则的
解释分析:
js解释器的链式索引规则中说明,当函数内使用了内部未定义的变量时,会依次向上层函 数进行取值索引,而其上层函数的局部变量销毁的时间是在函数执行完毕之后,所以当其内嵌函数fun()执行时,其上层函数的局部变量也还并未销毁,这样闭包的原理就得以解释完毕。并且,在此种闭包中,fun()对变量num值的修改会影响到上层函数中变量num的值
另一种写法:
function fn(){
var num = 10;
return function fun(){
console.log(num)
}
}
var f = fn()
f()
var f2 = fn()
存在的问题:
上面说到,是因为上层函数fn()并未执行完毕,所以局部变量并未销毁,其里面的内嵌函数fn()才能通过链式索引继续使用fn()的局部变量,而此处当 f = fn(),fn()明显已经执 行完毕了,按理说num已经销毁,但事实却是获取了其内函数体fun()的变量f依旧能够使用变量num
解释分析:
当执行f=fn()时,由于fun()中使用了其上层函数fn()中的局部变量,这导致在fn()并没有执行完毕,而是被fun()卡住了,所以其内的变量num并未被销毁,因此f()可以多次被调用,num却不会被销毁,甚至还可以对值进行累计更改的记录(只在fn()内部记录,不影响到fn(),这是与上一种写法的一个区别,原因时是 var f = fn()时,将fun()函数体存放到了一个新的空间),比如累加;导致的问题是:会因为fn()被卡住,导致其一直占用内存。
整体可以理解为:
num对于fn()和代码整体而言,是个局部变量(不能被外部函数调用),但是对于f()而言,是个从fn()继承而来的,可以累积记录变化的,不会被销毁的局部变量,这个值只在f()内部使用,值的更新不会影响到上层函数fn()里面相应的值,所以不管f()里面的值进行了怎样的变化,f2()里面的初始值还是从fn()里面获取的10

闭包的概念、作用、问题及解决方式相关推荐

  1. 闭包的概念,作用,和优缺点

    闭包的概念 闭包就是能读取其他函数内部变量的函数. 也可以简单的理解为:"定义在一个函数内部的函数" 闭包的形式 //在执行fn1时,其返回值是一个函数,即fn2,所以再一次执行的 ...

  2. JS 跨域问题常见的五种解决方式

    JS 跨域问题常见的五种解决方式 一.什么是跨域? 要理解跨域问题,就先理解好概念.跨域问题是由于javascript语言安全限制中的同源策略造成的. 简单来说,同源策略是指一段脚本只能读取来自同一来 ...

  3. Visual studio 2010出现“error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏”解决方式...

    本来自己的电脑上装了VS2010,因为开发Cocos2d-x 3.x,所以就在自己的机器上装了一个VS2012. 但是.这不装不要紧,debug一下自己原来的程序,结果出现了"error L ...

  4. vue 多个click_vue中touch和click共存的解决方式

    在vue开发手机端项目时,我们经常会遇到touch和click共存的情况,比如城市选择页面的字母滑动 touch事件在手机端会触发浏览器滑动,所以应给touch事件添加阻止默认行为touchmove. ...

  5. dma访问主存时_DMA导致Cache数据一致性问题的原因及其解决方式(理论篇)

    点击上方公众号名称关注,获得更多内容 ✎ 编 者 悟 语 唉!嫉妒之心真的能俘获它所接触到的任何目标啊--"欲加之罪,何患无辞"呢?"觉悟高的"更有" ...

  6. 常见浏览器兼容性问题与解决方式

    所谓的浏览器兼容性问题,是指由于不同的浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情况.在大多数情况下,我们的需求是,不管用户用什么浏览器来查看我们的站点或者登陆我们的系统,都应该是统一的 ...

  7. MySQL 异常:这一篇就够了,MySQL 抛出异常的几种常见解决方式小结

    Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: Connectio ...

  8. 修改elementUI组件样式无效的多种解决方式

    前言:vue+elementUI项目开发中,经常遇到修改elementUI组件样式无效的问题, 原因:在vue组件中我们经常需要给style添加scoped来使得当前样式只作用于当前组件的节点.添加s ...

  9. Java中多线程访问冲突的解决方式

    Java中多线程访问冲突的解决方式 当时用多线程访问同一个资源时,非常容易出现线程安全的问题,例如当多个线程同时对一个数据进行修改时,会导致某些线程对数据的修改丢失.因此需要采用同步机制来解决这种问题 ...

最新文章

  1. 三代数据组装软件canu
  2. 阿提拉公司 java_Atitit  文件上传  架构设计 实现机制 解决方案  实践java php c#.net js javascript  c++ python...
  3. ​Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数
  4. 作为前端,你不得不知道的SEO
  5. AndroidStudio中提示:Failed to resolve: com.github.CymChad:BaseRecyclerViewAdapterHelper:
  6. 最常见的20种VC++编译错误信息
  7. 如何判断京东达人文章是否下线
  8. faster rcnn的测试
  9. Java集合存放有序不重复的对象
  10. halcon测量两条线距离_三角测量算法:过滤可能的错误点
  11. HDU1013 POJ1519 Digital Roots
  12. zookeeper3.3.6 伪分布式安装
  13. linux游戏性能更好,linux游戏,linux游戏性能
  14. C/C++整型,定义、表示、范围,再看整型
  15. 软件项目管理案例教程(第三版)课后习题及答案
  16. Java和Python哪个更适合初学者的问题
  17. php变量覆盖,boblog任意变量覆盖漏洞
  18. 数据库及基本表的建立
  19. oracle 索引详解 注:转自红黑联盟非原创
  20. 原来早就被安排了,旅行社用机器学习给你推个性化定制游

热门文章

  1. 计算机操作系统练习题(五)
  2. 如何判断你是否有自主创业的条件
  3. 《牛津字典精华总结》- 初阶系列 - 字母 - D
  4. android界面的规范性,IOS和Android规范,UI看什么?(三)
  5. Android APK 的构建流程以及Gradle多版本构建
  6. 热度不减的计算机专业,真是就业“万金油”?毕业生晒出真实工资
  7. 【测开实战】从快手薅羊毛说起之Appium/原生XCUITest/原生UIAutomator菜鸟级入门
  8. hao123被百度收购的原由
  9. mac电脑循环次数多少算新_苹果电脑电池循环次数多少才正常?
  10. python【__setattr__】