JavaScript闭包底层解析
1. 闭包是一个函数,这个函数有权访问另一个函数作用域中的变量,创建闭包最常见的方式,就是在函数内部创建函数。要想彻底搞清其中细节,必须从函数从创建到调用的时候都发生了什么入手
2. 函数第一次被调用,创建一个执行环境,和相应的作用域链
3. 作用域链赋值给一个特殊的内部属性Scope
4. 使用this,arguments和其他命名参数的值初始化函数的变量对象
5. 在作用域链中,内部函数的活动对象处于第一位,外部函数的活动对象始终处于第二位……直至全局执行环境
6. 执行函数时,为读取写入变量的值,需要在作用域链中查找变量
function compare(a ,b){
if(a<b){
return -1;
}else if(a>b){
return 1;
}else{
return 0;
}
}
var result = compare(5,10); // -1 1. 第一次调用compare()函数时,会创建一个活动对象,包括{this,arguments ,a,b}
2. 全局执行环境的变量对象{compare , result, this},在compare()的作用域链中处于第二位的
7. 每一个执行环境都有一个用来存放变量的对象——变量对象
1. 全局环境中的变量对象始终存在
2. compare函数的局部环境的变量对象,只在函数执行过程中存在
8. 在创建compare函数时,先创建一个作用域链,这个作用域链预先就包含了全局变量对象
9. 作用域链保存在compare函数内部的Scope属性中
10. 调用compare函数时,会为函数创建一个执行环境,compare函数的局部变量对象被创建并放到作用域链的前端。
11. 所以,作用域链本质上是一个指向变量对象的指针列表,只引用但不实际包含变量对象
1. Scope[{this,arguments ,a,b} , {compare , result, this}]
2. compare函数在访问一个变量时,先从scope中第一个元素开始搜索,一个一个往后找
3. 函数执行完毕后,局部变量对象被销毁,内存中仅存全局变量对象
1. 存在闭包就不一样了
2. 在函数内部定义的函数(子函数)会将外部函数(父函数)的变量对象添加到它(子函数)的作用域链中
function createCompareFunction(propName){
return function(obj1 , obj2){
var a = obj1[propName];
var b = obj2[propName]; if(a<b){
return -1;
}else if(a>b){
return 1;
}else{
return 0;
}
}
} var compare = createCompareFunction('name');
var result = compare({name:"Nico"} , {name:"Greg"});//true 1. 在内部的匿名函数的作用域链中,实际上包含外部函数的变量对象
2. 这个内部的匿名函数被return到外部后,这个匿名函数它的作用域链被初始化了
3. 包含createCompareFunction函数的变量对象以及全局变量对象
4. 所以,匿名函数可以访问createCompareFunction函数中所有的变量
5. 更为重要的是,createCompareFunction函数执行完毕被销毁后,其变量对象还有一份保存在匿名函数中,所以仍可以访问其内部的变量
JavaScript闭包底层解析的更多相关文章
- Javascript闭包深入解析及实现方法
1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点:1. 作为一个函数变量的一个引用,当函数返回时 ...
- JavaScript闭包深入解析
for (var i=1; i<=5; i++) { setTimeout( function timer() { console.log( i ); }, i*1000 ); } --上面这段 ...
- JavaScript闭包的底层运行机制
转自:http://blog.leapoahead.com/2015/09/15/js-closure/ 我研究JavaScript闭包(closure)已经有一段时间了.我之前只是学会了如何使用它们 ...
- javascript闭包学习
(function(){})()===>>>>函数会被立即执行function(){}是一个函数用括号包起来表示是函数表达式再加()表示函数自执行 如何理解闭包?1.定义和用 ...
- JavaScript闭包(Closure)
JavaScript闭包(Closure) 本文收集了多本书里对JavaScript闭包(Closure)的解释,或许会对理解闭包有一定帮助. <你不知道的JavsScript> Java ...
- javascript闭包和作用域链
最近在学习前端知识,看到javascript闭包这里总是云里雾里.于是翻阅了好多资料记录下来本人对闭包的理解. 首先,什么是闭包?看了各位大牛的定义和描述各式各样,我个人认为最容易一种说法: 外部函数 ...
- Javascript闭包的一些研究
原文:Javascript闭包的一些研究 本文不谈闭包的概念,因为概念容易把人搞晕,本文希望通过几个鲜活的例子来探究闭包的性质,相信对理解闭包会有所帮助. 程序1 var f = (function( ...
- javascript闭包—围观大神如何解释闭包
闭包的概念已经出来很长时间了,网上资源一大把,本着拿来主意的方法来看看. 这一篇文章 学习Javascript闭包(Closure) 是大神阮一峰的博文,作者循序渐进,讲的很透彻.下面一一剖析. 1. ...
- javascript 闭包内部机制
在初学JavaScript函数式编程的时候,经常会出现令人出乎意料的结果,而原因,大都是由于不理解JavaScript闭包引起的:理解JavaScript的闭包,可以从JavaScript的闭包内部机 ...
随机推荐
- 关于Eclipse平台的使用和开发第一个SWT程序
IBM把投入巨资开发的Eclipse作为一个开源项目捐献给了开源组织Eclipse.org Eclipse出色而有独创的平台特性,现在仍由IBM子公司OTI(主要从事Eclipse开发的人)继续领导着 ...
- 어느 도시 보유 하 면 사랑 이다(事態が発生すれば、ある都市の恋はしません)【Si les villes un amour】{If have love in a city}
如果在北京拥有爱情 半夜在簋街喝啤酒 吃小龙虾 在后海的苦情歌声里 搂着你数那四合院的瓦片 如果在上海拥有爱情 去外滩手挽手 吹吹风 坐一下午 去城隍庙尝试各种小吃 嘲笑你嘴角残余的糯米糕 如果在杭州 ...
- 聊一聊 AngularJS 服务
什么是服务? 在 AngularJS 中,服务是一个函数或对象,可在你的 AngularJS 应用中使用. AngularJS 内建了30 多个服务. 为什么使用服务? 在很多服务中,比如 $loca ...
- mysql同时向一个表中插入多条数据问题!!见详细
INSERT INTO `表名` (`字段1`,`字段2`,`字段3`,`字段4`) values ('数组1数据1','数组1数据2','数组1数据3','数组1数据4'), ('数组2数据1',' ...
- Jquery方法大全
一.JQuery常用的方法 :(JQuery中90%都是方法,没有参数是获取,带参数是设置) $("#id").css('backgroundColor','blue'); .cs ...
- Mysql 冷备份批处理
@Rem Generate today date @echo wscript.echo dateadd("d",0,date)>GetOldDate.vbs @for /f ...
- 9月18日,SQL学习基础1
数据库管理和应用 Oltp是小型的管理,OLAP是大型的管理 开发的内容如触发器 数据库管理系统(Database Management System,简称为DBMS)是位于用户与操作系统之间的一层数 ...
- Java实战之02Hibernate-02映射、一级缓存、实体对象状态
五.映射基础 1.实体类采用javabean的编写规范 JavaBean编写规范: a.类一般是public的 b.有默认的构造方法 c.字段都是私有的 d.提供公有的getter和setter方法 ...
- nodejs-fs使用
(1)读取文本文件时须添加上'encoding'才能输出可读的内容. 02.txt hello,world! nodejs_readfile.js var fs = require('fs'); fs ...
- EL表达式 入门
为了使JSP写起来更加简单. 表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法. JSP EL语言定义 E L(Expression L ...