JavaScript闭包函数的理解
闭包就是一个函数能够访问其函数外部作用域中的变量,即在外面可以调用函数中的函数的变量,其实他就是将函数内外部连接起来的桥梁
闭包三大特点:
1. 函数嵌套函数
2. 内部函数可以访问外部函数的变量
3. 参数和变量不会被回收
对于初学者比较难理解,可以通过以下两句话来加深理解:
1、闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这
个函数的局部变量。闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。
2、不必纠结到底怎样才算闭包,其实你写的每一个函数都算作闭包,即使是全局函数,你访问函数外部的全局变量时,就是闭包的体现。
这里举个例子,观察以下代码:
function a(){var i = 10; function b(){alert(i);} return b; }var c = a();c();
这段代码有以下两个特点:
1、函数b嵌套在函数a内部;2、函数a返回函数b;
引用关系如下:
这样在执行完var c = a()后,变量c实际上是指向了函数b,b中用到了变量i,再执行c()后就会弹出一个窗口显示i的值(第一次为1)。这段代码其实就创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内的函数b,就是说:
当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个我们通常所谓的“闭包”。
当函数b执行的时候亦会像以上步骤一样。因此,执行时b的作用域链包含了3个对象:b的活动对象、a的活动对象和window对象,如下图所示:
如图所示,当在函数b中访问一个变量的时候,搜索顺序是:
1. 先搜索自身的活动对象,如果存在则返回,如果不存在将继续搜索函数a的活动对象,依次查找,直到找到为止。
2. 如果函数b存在prototype原型对象,则在查找完自身的活动对象后先查找自身的原型对象,再继续查找。这就是Javascript中的变量查找机制。
3. 如果整个作用域链上都无法找到,则返回undefined。
闭包的用途
1. 闭包可以读取函数内部变量 2. 将函数内部变量的值始终保存在内存中
使用闭包的注意点
1. 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2. 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值
转载于:https://www.cnblogs.com/menglong1214/p/9160583.html
JavaScript闭包函数的理解相关推荐
- JavaScript闭包函数的理解与使用
要理解闭包,首先理解javascript特殊的变量作用域,变量的作用域无非就是两种: 全局变量 局部变量 javascript语言的特殊处就是函数内部可以读取全局变量. 1.如何从外部读取局部变量 我 ...
- javascript匿名函数的理解
复制粘贴 [color=red]点评:请记住,关键点是理解javascript的函数概念(参考w3cshool对函数的描述,搜索关键字:ECMAScript 函数).以及()的运算的理解. 比如:va ...
- JavaScript闭包函数与闭包释放
作用域链:一般,变量取值是到创建这个变量的函数的作用域中取值,如果没有查到,就会往上查找,直到找到全局作用域,这个查找的形成为作用域链. Javascript闭包函数:闭包就是能够读取其它函数内部变量 ...
- JavaScript闭包函数
JavaScript闭包函数 1 概述 2 词法作用域 3 闭包 1 概述 一个函数和对其周围状态(词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure).也就是说, ...
- JavaScript闭包函数理解
JavaScript闭包 一.变量的作用域: 要理解闭包,首先必须理解JavaScript特殊的变量作用域. 变量作用域无非就是两种:全局变量 和 局部变量. JavaScrip ...
- javascript 匿名函数的理解
代码如下: (function(){ //这里忽略jQuery所有实现 })(); (function(){ //这里忽略jQuery所有实现 })(); 半年前初次接触jQuery的时候,我也像其他 ...
- 对JAVASCRIPT匿名函数的理解
网上很多解释,我无法理解,我想知道原理...这篇文章应该可以透彻一点 Query片段: view plaincopy to clipboardprint? (function(){ //这里忽略jQu ...
- 对javascript匿名函数的理解(透彻版)
Query片段: view plain copy to clipboard print ? (function(){ //这里忽略jQuery所有实现 })(); 半年前初次接触jQuery的时候,我 ...
- JavaScript闭包函数详解
目录 闭包函数 变量作用域 闭包的概念 闭包的用途 闭包的缺点 闭包函数 变量作用域 要理解JavaScript闭包,就要先理解JavaScript的变量作用域. 变量的作用域有两种:全局的和局部的( ...
- JavaScript闭包的个人理解
闭包指的就是内部函数可以访问外部函数的作用域,也就是通过一个函数的子函数来访问这个函数作用域下的变量. 我们可以看一下下面的函数 function Closure() {var number = 99 ...
最新文章
- 最新3D目标检测文章汇总(包含ECCV20和ACMMM20)
- 深入JVM——OOM异常解析
- Linux 线程(1):线程概述
- 记录一种多个按钮中每次只能选中一个的实现方式
- python做一个考试系统_Python在线考试系统防作弊功能的思路和实现
- Spring Boot学习总结(6)——SpringBoot解决ajax跨域请求问题的配置
- 【Java】equals源码分析
- Linux无盘工作站
- 服务器的mp4文件是黑屏,Windows7的Windows media player 播放由影音制作生成的Mp4视频,出现黑屏、重启动...
- 【扫盲系列】网络术语
- 定期删除IIS日志文件
- 5ic计算机考试考卷读取错误,北京自考出现错误试卷
- 利用pyboardCN V2播放Bad apple
- Justinmind使用教程(3)——管理原型
- linux安装mongodb,实测好用
- C7N新增,保存,删除基础模板
- 正海转债,寿22转债,东材转债上市价格预测
- VS2017下解决:error LNK2019: 无法解析的外部符号 __iob_func
- C语言直接驱动硬件实现PC机的串口操作
- XHR level2的新功能
热门文章
- 你真的要收下这份大礼包!!
- 创业宝典:未来企业家之路(第5版)
- Python获取网络中的存活主机以及哪些主机是Linux
- webpack4打包vue前端多页面项目
- Diagnostics: File file:/tmp/spark-***/__spark_libs__***.zip does not exist
- Junit4与junt3并存时产生的问题
- android动画的实现过程
- HttpModule和HttpHandler的常见用法
- MapXtreme 2005 学习心得 将wor格式转wms格式(十)
- Linux常用基本命令及应用技巧1