js闭包的理解-目前网上分析的最透彻文章
js的闭包对于大家实际上并不陌生,但是真正敢说自己完全理解的人并不多。笔者在网上看到分析闭包的文章非常多,篇幅用的非常多,但是实际上分析的并不到位,或者根本就是不正确的。我有时候都在想,写这些文章的人自己未必真的理解了。今天我就为大家说到说到js的闭包,看完你百分百的能够理解。
说闭包之前,我们先要说一个js的概念
js的变量不是传统意义的变量,是一个广义的概念
例如:
1、var i=0;
2、var str="china";
3、var fun=function(){...}
第1个和第2个大家非常好理解,第3个简单的解释一下,它代表的是一个函数表达式,看到了吗?变量可以是一个函数,它实际上就是一个函数,要使用它直接就是fun();
如果想要了解更多的函数表达式的概念,大家可以去查一下相关资料,网上资料很多,也很容易看得懂。我就不多说了,OK!我讲闭包之前先要掌握的概念就是这么多!
进入正题:
网上使用最多的一个例子如:
function box(){
var arr = [];
for(var i=0;i<5;i++){
arr[i] = function(){
return i;
}
}
return arr;
}
网上的分析各种诡异看不懂,我直接给出我的结论,调用box()后,我们得到了一个数组,数组中是一个一个的函数表达式:
[
function(){return i},
function(){return i},
function(){return i},
function(){return i},
function(){return i}
]
大家不要懵逼,这里很容易理解,我们看这里,在给数组arr赋值的时候,本来就是赋值的一个函数表达式
arr[i] = function(){
return i;
}
大家明白了吧,你自己完全也可以使用alert(box());打印结果进行验证,大家可能还有一点儿疑惑,我要的是值,不是表达式啊,很简单,获取函数表达式的值只需要在变量后面加一个(),所以
alert(box()[0]());结果是5,因为变量i现在的值是5,所以数组中的值都是5.就这么简单!
闭包可以干什么?闭包可以让外部访问内部的局部变量
还是以一个例子来解释:
function test(){
var i=6;
return i;
}
这就是一个最简单的闭包,局部变量通过函数返回。其它的应用都是类似,万变不离其宗!
js闭包的理解-目前网上分析的最透彻文章的更多相关文章
- JS闭包的理解及常见应用场景
JS闭包的理解及常见应用场景 一.总结 一句话总结: 闭包是指有权访问另一个函数作用域中的变量的函数 1.如何从外部读取函数内部的变量,为什么? 闭包:f2可以读取f1中的变量,只要把f2作为返回值, ...
- 个人对js闭包的理解
闭包算是前端面试的基础题,但我看了很多关于闭包的文章博客,但感觉很多对于闭包的理想还是有分歧的,现在网上对闭包的理解一般是两种: 有些文章认为闭包必须要返回嵌套函数中里面用到外面函数局部变量的方法 ...
- 【闭包】JS闭包深入理解
先看题目代码: 1 2 3 4 5 6 7 8 9 10 11 12 function fun(n,o) { console.log(o) return { fun:function(m){ ...
- 从循环添加事件谈起对JS闭包的理解
1.引子 相信很多初学js的人,都遇到这样一种情况:想要给一堆按钮添加各自的事件,比如点击第i个按钮时,弹出i这个值.理所当然地,我们会这样写: var buttons = document.getE ...
- 对JS闭包的理解
闭包,是JS里很重要的一个概念,也是相对来讲不太容易理解的一个东西,不过即使难理解,我们也要迎难而上啊,嘿嘿,网上有很多文章都在讲闭包,我在看JS设计模式的时候,书里也着重讲了闭包,但是书里官方的的确 ...
- 浅谈对Js闭包的理解
理解Js的闭包,首先让我们先看几个概念 执行环境(executive environment)每个函数都有自己的执行环境,匿名函数默认为全局环境. 作用域链(scope chain)子函数继承父函数, ...
- js 闭包原理理解
问题?什么是js(JavaScript)的闭包原理,有什么作用? 一.定义 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 很显然 ...
- JS闭包的理解
闭包的两个特点: 1.作为一个函数变量的一个引用 - 当函数返回时,其处于激活状态.2.一个闭包就是当一个函数返回时,一个没有释放资源的栈区. 其实上面两点可以合成一点,就是闭包函数返回时,该函数内部 ...
- JS闭包深入理解(理解篇)
看书的时候很是不明白为啥变量老是五,经过认真思考的出一下理解: function box() { var arr = []; for (var i = 0; i < 5; i++) { ...
随机推荐
- msvcr100.dll丢失原因及解决方法
msvcr100.dll为Visual Studio 2010的一个动态链接库,如果某程序是用它开发出来的,那么该程序的运行就有可能需要此动态链接库.有些程序直接将其打包到了安装目录,并注册,就不会出 ...
- 设计模式:命令(Command)模式
设计模式:命令(Command)模式 一.前言 命令也是类,将命令作为一个类来保存,当要使用的时候可以直接拿来使用,比如脚本语言写出的脚本,只需要一个命令就能执行得到我们想要的需要操作很长时间才能得到 ...
- java virtualVM远程配置方法
在/etc/hosts中设置主机名和ip的对应关系 ip为用java virtualVM链接服务器的ip 如: 10.175.0.191 host-ai #rmiregistry不知道干 ...
- selenium 截图加上时间戳
思路: 1 新建screenshot文件夹,不存在则创建该目录 2 在screenshot文件夹下新建当日日期文件夹,比如20190110:不存在则创建该目录 3 截图保存到当日文件夹,且截图文 ...
- bzoj2331 [SCOI2011]地板
Description lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里有些位置有柱子,不能铺地板.现在小L想知道,用 ...
- mint-ui 填坑之路
swipe组件 因为项目加载eslint的缘故也就没有像之前的项目一样引用swiper框架.这个轮播图的组件文档实在是不敢恭维(尽管其他的文档也好不到哪里去),官方给出的参数真是少的可怜,一些方法也并 ...
- 如何将编写好的CS文件做成exe可执行文件
编译好的控制台CS文件: cs文件单独拿出来放到F盘目录中 打开命令提示CMD: 执行下面语句即可在F盘目录中看到生成的exe文件,windows系统下双击就可运行: C:\Windows\Micro ...
- MVC学习十二:Ajax.ActionLink用法
Ajax.ActionLink用法 <!--使用Ajax.BeginForm必须引用的js文件--> <script type="text/javascript" ...
- Objective-C——消息、Category和Protocol
转自:http://www.cnblogs.com/chijianqiang/archive/2012/06/22/objc-category-protocol.html 面向对象永远是个可以吐槽的话 ...
- IOS开发数据存储篇—IOS中的几种数据存储方式
IOS开发数据存储篇—IOS中的几种数据存储方式 发表于2016/4/5 21:02:09 421人阅读 分类: 数据存储 在项目开发当中,我们经常会对一些数据进行本地缓存处理.离线缓存的数据一般都 ...