理解JavaScript闭包
- 什么是闭包
 
闭包是指有权访问另一个函数作用域中的变量的函数(有点拗口吧),简单点就是在一个函数的内部创建另外一个函数,并返回这个函数的引用。(这也是创建闭包的常用方式)
function outerFunc (outerNum) {
    return function innerFunc(innerNum) {
        outerNum=outerNum+innerNum;
        return outerNum;
    }
}
var inner=outerFunc(1);
var a1=inner(11);
console.log(a1)//输出为12
var a2=inner(2);
console.log(a2)//输出为14
上面的代码就创建了一个闭包,里面的innerFunc有权访问外面函数的变量outerNum。
不明白,没关系,我们先看执行这个函数的内存情况
在JavaScript里面,有一个概念叫做作用域,我们定义一个下面的函数
function sample (value1,value2) {
    var temp;
    temp=value1+value1;
    return temp;
}
var result=sample(5,6);
当sample函数执行时的作用域链如下

后台的每个执行环境都有一个表示变量的对象(变量对象)。全局环境的变量对象始终存在,而像sample()函数这样的局部环境变量对象,则只在函数的执行过程中存在。
当sample(5,6)执行完毕后,sample的执行环境的作用域链就会被销毁,sample()的活动对象就没有被引用了,那么sample()的活动对象就会被销毁,如上图的红色虚线框表示就要被销毁的。因为全局变量对象是需要整个执行环境被销毁才会被销毁(整个程序执行完毕,程序退出后)。
- 闭包的作用域链
 
现在我们回到最初的闭包,看看这个闭包的作用域链又是怎样的

如上图,当outerFunc(1)执行后,outerFunc的执行环境作用域链就要被销毁,就是红色虚线框的部分表示被销毁的,本来outerFunc()的活动对象也是要被销毁的,但是系统检测到,outerFunc()的活动对象还被innerFunc的执行环境作用域链引用,所以它就被保存了下来,也就是说里面的值也被保存了下来
执行完inner(11)后,outerNum=12,再执行inner(2)的话,outerNum=14
理解JavaScript闭包的更多相关文章
- 我从来不理解JavaScript闭包,直到有人这样向我解释它...
		
摘要: 理解JS闭包. 原文:我从来不理解JavaScript闭包,直到有人这样向我解释它... 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 正如标题所述,JavaScript闭包 ...
 - 深入理解JavaScript闭包【译】
		
在<高级程序设计>中,对于闭包一直没有很好的解释,在stackoverflow上翻出了一篇很老的<JavaScript closure for dummies>(2016)~ ...
 - 【转】深入理解JavaScript闭包闭包(closure) (closure)
		
一.什么是闭包?"官方"的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.相信很少有人能直接看懂这句话,因为他描述 ...
 - 全面理解Javascript闭包和闭包的几种写法及用途
		
好久没有写博客了,过了一个十一长假都变懒了,今天总算是恢复状态了.好了,进入正题,今天来说一说javascript里面的闭包吧!本篇博客主要讲一些实用的东西,主要将闭包的写法.用法和用途. 一.什么 ...
 - 深入理解JavaScript闭包(closure)
		
最近在网上查阅了不少javascript闭包(closure)相关的资料,写的大多是非常的学术和专业.对于初学者来说别说理解闭包了,就连文字叙述都很难看懂.撰写此文的目的就是用最通俗的文字揭开Java ...
 - 深入理解javascript闭包(一)
		
闭包(closure)是Javascript语言的一个难点.也是它的特色,非常多高级应用都要依靠闭包实现. 一.什么是闭包? 官方"的解释是:闭包是一个拥有很多变量和绑定了这些变量的环境的表 ...
 - 深入理解javascript闭包(一)
		
原文转自脚本之家(http://www.jb51.net/article/24101.htm) 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. ...
 - 深入理解Javascript闭包概念
		
一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部能够直接读取全局变量 ...
 - 轻松理解JavaScript闭包
		
摘要 闭包机制是JavaScript的重点和难点,本文希望能帮助大家轻松的学习闭包 一.什么是闭包? 闭包就是可以访问另一个函数作用域中变量的函数. 下面列举出常见的闭包实现方式,以例子讲解闭包概念 ...
 - 【译】理解JavaScript闭包——新手指南
		
闭包是JavaScript中一个基本的概念,每个JavaScript开发者都应该知道和理解的.然而,很多新手JavaScript开发者对这个概念还是很困惑的. 正确理解闭包可以帮助你写出更好.更高效. ...
 
随机推荐
- [Spice-devel] usbredir for Windows Client
			
Hello, I have been scouring the internet for information on how to do this. I've successfully instal ...
 - Spring配置MyBatis
			
1.MyBatis配置文件(mybatis-config) <?xml version="1.0" encoding="UTF-8"?> <! ...
 - AlertDialog
			
1.AlertDialog点击时不自动消失 //在setPositiveButton和setNegativeButton根据自己的逻辑处理,大概代码如下 if(validate){//验证通过自动消失 ...
 - INPUT输入框灰体提示
			
INPUT输入框灰体提示 <input type="text" value='15 words limit' style="color:#999999" ...
 - 本地开发 localhost链接数据库比127.0.0.1慢
			
自己手写一段代码的时候发现一个问题 链接数据库的时候 用 127.0.0.1比localhost明显的快,localhost要等一下才会有响应 而127.0.0.1就是瞬间响应.一番排查,发现了一个 ...
 - js方法重载
			
test(5); test(5,5); function test(a){ alert(a); } function test(a,b){ alert(a+b); } NaN和10,说明第二个覆盖了第 ...
 - Serializable在C#中的作用.net中的对象序列化 (转)
			
序列化是指将对象实例的状态存储到存储媒体的过程,在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转 换为字节流,然后再把字节流写入数据流,在随后对对象进行反序列化时,将创建出 ...
 - IEnumerable和IEnumerator 详解
			
初学C#的时候,老是被IEnumerable.IEnumerator.ICollection等这样的接口弄的糊里糊涂,我觉得有必要切底的弄清楚IEnumerable和IEnumerator的本质. 下 ...
 - 序列化与反序列化Serialize&Deserialize
			
序列化是指一个对象的实例可以被保存,保存成一个二进制串,当然,一旦被保存成二进制串,那么也可以保存成文本串了.比如,一个计数器,数值为2,我们可以用字符串“2”表示.如果有个对象,叫做connter, ...
 - iOS开发——面试笔试精华(三)
			
面试笔试精华(三) 1. When to use NSMutableArray and when to use NSArray? 什么时候使用NSMutableArray,什么时候使用N ...