让你一句话理解闭包(简单易懂)

 更新时间:2016年06月03日 09:51:45   投稿:jingxian  
下面小编就为大家带来一篇一句话理解闭包(简单易懂)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

接触javascript很久了,每次理解闭包都似是而非,最近在找Web前端的工作,所以需要把基础夯实一下。

本文是参照了joy_lee的博客 闭包 在她这篇博客的基础上以批注的形式力争把我的理解阐述出来,如果有不当之处,欢迎批评指正。

《高级程序设计》上,这样说:当在函数内部定义了其他函数时候,就创建了闭包。闭包有权访问包含函数内部的所有变量。

这句话怎么理解呢?照这句话理解的话,闭包就是一个嵌套函数嘛!嵌套函数对包含它的函数的变量当然可以访问,这是没有问题的。

一般来说,内部函数是能够访问到上一级乃至全局的的变量的,那么就有人这样理解:通过闭包,可以实现外部访问函数局部内的变量。

(如果我们把作用域简单的分个级的话,假设全局作用域作为第一级,其中定义的函数体内部作用域作为第二级,在第二级作用域内嵌套定义的函数体内部作用域作为第三级,....等等,传统意义上,第一级不能访问第二级的变量(这种变量叫做局部变量),第二级不能访问第三级,...,而反过来是可以的,这就是作用域链。本级作用域内找不到再到上一级找,直至第一级全局。而闭包这种机制可以在第一级作用域中通过第三级作用域引用到第二级作用域中的变量,而方法就是在第二级作用域向第一级作用域返回拥有第三级作用域的函数引用。 这个引用才是关键,因为这个引用的存在,相关的第三作用域与第二作用域都成了这个引用运行的上下文,迫使垃圾回收机制GC不能回收这条链上所占用的资源。而如果没有这个引用,则跟一般函数一样,函数运行完资源就会被回收。而我的疑惑也在于此,闭包单指函数中的嵌套函数还是指被第一级引用了的嵌套函数?还是都是?还是说闭包并不是嵌套函数而是嵌套函数被第一级作用域引用时所形成的这种机制?)

function a(){ 
 
   var i=0; 
 
  function b(){ 
 
     alert(++i); 
 
    } 
 
   return b; 
 
 } 
 
 var c = a(); 
 
 c();

即,闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。

由于闭包的存在使得函数a返回后,a中的i始终存在,这样每次执行c(),i都是自加1后alert出i的值。

那么,如果a不返回函数b,情况就完全不同了。因为a执行完后,b没有被返回给a的外界,只是被a所引用,而此时a也只会被b引用,因此函数a和b互相引用但又不被外界打扰(被外界引用),函数a和b就会被GC回收。

实际上是就是闭包延长变量的生命周期。通常函数的作用域即变量会在函数执行结束后被销毁,但当函数返回一个闭包,只要闭包不被释放,整条作用域链都会占用内存。(闭包延长变量的生命周期,这是指被第一级引用的情况。但如果没有这个引用,闭包还能称其为闭包吗?

说道作用域链:即 函数自己的作用域、上一层的函数的作用域....和全局作用域。访问一个变量时,自己的没有,就一层层往上找,直至全局,若还没有,就报错。

很想吐槽一句,闭包的作用域链是弯的。

PS: 有网友推荐了另一篇文章javascript闭包概念简单解析,是不是权威暂且不提,总算有一个明确的概念:

说了这么多,闭包到底是什么,下面做一下总结:

闭包是一个概念,它描述了函数执行完毕内存释放后,依然内存驻留的一个现象,只要把握这个核心概念,闭包就不难理解了。

以上这篇让你一句话理解闭包(简单易懂)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色

    JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色

    ExtJS中的表格功能非常强大,包括了排序、缓存、拖动、隐藏某一列、自动显示行号、列汇总、单元格编辑等实用功能,通过本篇文章给大家介绍JavaScript中使用sencha gridpanel 编辑单元、改变单元格颜色,感兴趣的朋友一起学习
    2015-11-11
  • JS对select控件option选项的增删改查示例代码

    JS对select控件option选项的增删改查示例代码

    Javascript操作select是表单中比较常见的,大家可以在网上搜索到很多的相关资料,接下来为大家详细介绍下,JS动态操作select中的各种方法,感兴趣的朋友可以参考下
    2013-10-10
  • 微信小程序使用扩展组件库WeUI的入门教程

    微信小程序使用扩展组件库WeUI的入门教程

    WeUI是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信内网页和微信小程序量身设计,令用户的使用感知更加统一,下面这篇文章主要给大家介绍了关于微信小程序使用扩展组件库WeUI的相关资料,需要的朋友可以参考下
    2022-04-04
  • Bootstrap基本样式学习笔记之表格(2)

    Bootstrap基本样式学习笔记之表格(2)

    Bootstrap提供了一个清晰的创建表格的布局,这篇文章主要介绍了Bootstrap学习笔记之表格基本样式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • JS操作Cookie写入和读取实例代码

    JS操作Cookie写入和读取实例代码

    JS操作Cookie,包含了写入和读取及读取value的值,适合新手朋友,感兴趣的朋友可以参考下
    2013-10-10
  • JS实现深拷贝的几种方法介绍

    JS实现深拷贝的几种方法介绍

    这篇文章介绍了JS实现深拷贝的几种方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • JavaScript前后端数据交互工具ajax使用教程

    JavaScript前后端数据交互工具ajax使用教程

    Ajax(Asynchronous Javascript And XML),即是异步的JavaScript和XML,Ajax其实就是浏览器与服务器之间的一种异步通信方式
    2022-10-10
  • JavaScript函数重载操作实例浅析

    JavaScript函数重载操作实例浅析

    这篇文章主要介绍了JavaScript函数重载操作,结合一次面试经历分析了JavaScript函数重载相关原理、用法及操作注意事项,需要的朋友可以参考下
    2020-05-05
  • javascript手工制作悬浮菜单

    javascript手工制作悬浮菜单

    这篇文章主要介绍了javascript手工制作悬浮菜单,主要也是想自己练练手,感觉还不错,这里推荐给大家。
    2015-02-02
  • webpack教程之webpack.config.js配置文件

    webpack教程之webpack.config.js配置文件

    本篇文章主要介绍了webpack教程之webpack.config.js配置文件 ,具有一定的参考价值,有兴趣的可以了解一席
    2017-07-07

最新评论