JavaScript 闭包理解
闭包就是能够读取其他函数内部变量的函数,因为 JS 中,只有函数内部的子函数才能读取局部变量,因此闭包的本质:就是在一个函数内部创建一个函数,创建的函数可以访问到当前函数的局部变量
1、闭包的特点:
1、函数嵌套函数
2、函数内部可以引用函数外部的参数和变量
3、参数和变量不会被垃圾回收机制回收
2、闭包的用途:
1、通过在外部调用闭包函数,可以在函数外部访问到函数内部的变量
2、使已经运行结束的函数上下文中的变量对象继续留在内存中,因为闭包函数保留了这个变量对象的引用,所以这个变量对象不会被回收
以下是两个代码例子(方便理解)
function fn(){var num = 1;return function(){return num;}
}var fn1 = fn();
console.log(fn1());//1
以上代码中,fn()中的返回值是一个匿名函数,这个函数在fn()作用域中,使用它可以访问到fn()作用域下变量num的值,然后将这个值作为返回值赋给全局变量fn1,这样就实现了在函数外部访问函数内部的变量
function fn(){var num = 1;return function(){var n = 0;console.log(++n);console.log(++num);}
}var fn1 = fn();
fn1();// 1 2
fn1();// 1 3
fn1();// 1 4
以上代码中,fn()中的返回值是一个匿名函数,这个匿名函数被赋给了fn1,因为当一个函数执行结束后,函数和它里面的变量都会被摧毁掉。而匿名函数中访问了fn()里的变量num,所以变量num不会被销毁,而fn1()执行结束后,fn1()和里面的变量n都会被销毁,只剩下变量num留在内存中,这就实现了在函数执行结束后,使变量继续保留在内存中。
3、循环使用闭包解决var定义函数的问题(面试题)
//每隔1s输出一个i
for (var i = 1 ; i <= 5 ; i++) {(function(i){setTimeout(function timer(){console.log(i);},1000*i)})(i)
}
//输出 1 2 3 4 5 //同时输出1 2 3 4 5
for (var i = 1 ; i <= 5 ; i++) {(function(i){setTimeout(function timer(){console.log(i);},1000)})(i)
}
//输出 1 2 3 4 5
4、闭包优点
①保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突
②在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存)
③匿名自执行函数可以减少内存消耗
5、闭包缺点
①被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null;
②其次由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响
参考文章:JS中的闭包
JavaScript 闭包理解相关推荐
- JavaScript闭包理解【关键字:普通函数、变量访问作用域、闭包、解决获取元素标签索引】...
一.闭包(Closure)模糊概述 之前总觉得闭包(Closure)很抽象而且难理解,百度一下"闭包"名词,百度的解释是:"闭包是指可以包含自由(未绑定到特定对象)变量的 ...
- 我我我我终于理解闭包了,哈哈哈哈(仰天长啸)(JavaScript闭包理解)
想要理解闭包.首先得了解JavaScript中的三个东西. 1,函数内部可以访问的范围. 就是说,函数内部能访问,自身内部以及自身外层的变量.(这个很好理解,大部分语言都是如此) 如: var a = ...
- 全面理解Javascript闭包和闭包的几种写法及用途【转】
一.什么是闭包和闭包的几种写法和用法 1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. ...
- 全面理解Javascript闭包和闭包的几种写法及用途
一.什么是闭包和闭包的几种写法和用法 1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. ...
- 让你分分钟理解 JavaScript 闭包
原文:https://www.cnblogs.com/onepixel/p/5062456.html 让你分分钟理解 JavaScript 闭包 闭包,是 Javascript 比较重要的一个概念,对 ...
- 全面理解Javascript闭包和闭包的几种写法及用途--转载自https://www.cnblogs.com/yunfeifei/p/4019504.html...
全面理解Javascript闭包和闭包的几种写法及用途 好久没有写博客了,过了一个十一长假都变懒了,今天总算是恢复状态了.好了,进入正题,今天来说一说javascript里面的闭包吧!本篇博客主要讲一 ...
- [转载]深入理解JavaScript闭包(closure)
最近在网上查阅了不少Javascript闭包(closure)相关的资料,写的大多是非常的学术和专业.对于初学者来说别说理解闭包了,就连文字叙述都很难看懂.撰写此文的目的就是用最通俗的文字揭开Java ...
- javascript深入理解js闭包[转]
一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...
- javascript深入理解js闭包
一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...
- 深入理解Javascript闭包(一)
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用于.变量作用域包括 ...
最新文章
- matlab编程实现k_means聚类(k均值聚类)
- 价值2950亿美元的「量子霸权」,技术水平到了哪个阶段
- MOSS Single Sign On Setup Step-By-Step( 转)
- Ansible管理节点过多导致的超时问题解决方法
- PHP生成验证码图片
- gimp教程:gimp界面介绍
- java timer schedule_java怎么再次设置Timer的schedule???
- python引用传递_python 是值传递还是引用传递 知乎
- Java程序员如何提升技能
- hibernate框架 最新_2020年最新Java后端学习路线,送给正在入门学习Java的你!
- 深度解读最流行的优化算法:梯度下降
- 理解 Delphi 的类(十一) - 深入类中的方法[12] - 消息方法
- Myeclipse如何使用自带git工具向远程仓库提交代码(转)
- mysql修改视图语句alter_MySQL修改视图(ALTER VIEW)
- matlab seawater,seawater Matlab seawater工具包 联合开发网 - pudn.com
- 电脑键盘灯光的调节方法
- pytorch 模型输出特征 保存npy
- 网络安全如何做?提防黑客来“敲门”
- 中英文颜色对照表(转)
- comp3311辅导 assignment1