闭包是指有权访问另一个函数作用域中的变量的函数,创建的常见方式就是在一个函数内部创建另一个函数。
我们来理解下执行环境和作用域链:
1.执行环境有全局执行环境和函数执行环境之分。
2.每次进入一个新的执行环境,都会创建一个用于搜索变量和函数的作用域链。
3.函数的局部环境不仅有权访问函数作用域中的变量,而且有权访问其包含(父)环境,由底向上乃至全局环境。
4.变量的执行环境有助于确定应该何时释放内存。
执行环境和作用域链
function createComparisonFunction(propertyName){
     return function(object1,object2){
     var value1=object1[propertyName];
     var value2=object2[propertyName];
     
     if(value<value2){
          return -1;
     }else if(value1>value2){
          retutn 1; 
     }else{
         return 0; 
     }
     };
}
//创建函数
var compareNames=createComparisonFunction("name");
//调用函数
var result=compareNames({name:"joey"},{name:"ross"});
//接触对匿名函数的引用,用于释放内存
compareNames=null;

因为只是用于自己加强理解,就直接把图片放在这里了,因为用于文字实在很难描述出来作用域链的关系。
值得一提的是,每个执行环境都有表示变量的对象--变量对象,全局环境中的变量对象始终存在,而内部函数的局部环境变量则只在函数执行过程中存在。
而在这个例子中,createComparisonFunction()的作用域链包含两个变量对象,一个本身的活动对象,一个全局变量对象,而匿名函数的作用域链包含着三个对象变量,多了一个自身的闭包活动对象,外面访问不进来,里面却可以访问外面,所以也包含外部函数的活动对象和全局变量对象,重要的是,当外部函数执行完毕之后,它的活动对象也不会被销毁,因为匿名函数的作用域链接仍然在引用这个活动对象,换句话说,外部函数返回后,其执行环境会销毁,但是它的活动对象依然留在内存中,知道匿名函数被销毁,外部函数的活动对象才会被销毁。
闭包与变量
function create(){
var result=new Array();
for(var i=0; i<10, i++){
result[i]=function(){
return i
}
}
}
//蓝色的全局变量对象,红色的是create()函数活动对象,绿色的闭包的活动对象。

作用域链的这种配置机制引出一个值得注意的副作用,闭包只能取得包含函数中任何变量的最后一个值。
上面这句话是重点,这个代码我起初没看懂的,反复理解了之后才懂,这个函数会返回一个函数数组,[0(),1().....9()],从0到9,而函数返回的 i  值应该对应函数名称,即是0()里面返回0,1()里面返回1,以此类推,实际上每个函数返回的都是10,因为 create()这个函数的作用域链保存这这个函数的活动对象,活动对象有result,还有i,函数调用后,变量 i 的值已经是10,并且保存在活动对象里,此时闭包去引用的都是同一个 i 。

转载于:https://www.cnblogs.com/Agrass/p/6595875.html

闭包、执行环境、作用域链相关推荐

  1. js执行环境作用域和闭包_JavaScript中执行上下文,提升,作用域和闭包的终极指南

    js执行环境作用域和闭包 It may seem surprising, but in my opinion the most important and fundamental concept to ...

  2. JS高级——函数执行、作用域链内存结构图

    一.JavaScript的执行过程 假如我们有下面一段代码,它在JavaScript中是如何被执行的呢? 1.1 第一步:初始化全局对象 js引擎会在执行代码之前,会在堆内存中创建一个全局对象:Glo ...

  3. 串讲-解释篇:作用域,作用域链,执行环境,变量对象,活动对象,闭包

    这篇接:理论篇:作用域,作用域链,执行环境,变量对象,活动对象,闭包 看例子: function compare(value1, value2) {if (value1 < value2) {r ...

  4. 闭包,作用域链,垃圾回收,内存泄露

    关于闭包,我翻了几遍书,看了几遍视频,查了一些资料,可是还是迷迷糊糊的,干脆自己动手来个总结吧 !欢迎指正... (- o -)~zZ 1. 什么是闭包? 来看一些关于闭包的定义: 闭包是指有权访问另 ...

  5. 图解Javascript——作用域、作用域链、闭包

    什么是作用域? 作用域是一种规则,在代码编译阶段就确定了,规定了变量与函数的可被访问的范围.全局变量拥有全局作用域,局部变量则拥有局部作用域. js是一种没有块级作用域的语言(包括if.for等语句的 ...

  6. JavaScript重难点解析4(作用域与作用域链、闭包详解)

    JavaScript重难点解析4(作用域与作用域链.闭包详解) 作用域与作用域链 作用域 作用域与执行上下文 作用域链 闭包 闭包理解 将函数作为另一个函数的返回值 将函数作为实参传递给另一个函数调用 ...

  7. JavaScript执行上下文和作用域链

    执行上下文作用域链 执行上下文(Execution Context):函数执行前进行的准备工作(也称执行上下文环境) 运行 JavaScript 代码的时候,当代码执行进入一个环境时,就会为该环境创建 ...

  8. JavaScript作用域、上下文、执行期上下文、作用域链、闭包

      作用域.上下文.执行期上下文.作用域链.闭包是JavaScript中关键概念之一,是JavaScript难点之一,在应聘面试时必定会问到的问题,作为前端工程师必须理解和掌握.相信大家已经阅读了很多 ...

  9. 作用域链和闭包?JS引擎如何选择顺序的选择变量?

    前言 前面的博客我已经说完了块级作用域的实现,站在变量环境和词法环境的角度下去看待这些个问题,会让你对js的工作模式有更加清晰的认识. 接下来我们看一段代码 function bar() {conso ...

  10. 面试之作用域链与闭包

    闭包有多重要?如果你是初入前端的朋友,我没有办法直观的告诉你闭包在实际开发中的无处不在,但是我可以告诉你,前端面试,必问闭包.面试官们常常用对闭包的了解程度来判定面试者的基础水平,保守估计,10个前端 ...

最新文章

  1. Java学习总结:10
  2. Swift 可选类型(补充)
  3. 一种高效的可变行高列表行定位算法
  4. Windows 2008 VS2008 IIS7 中调试Asp.net 2.0 两个问题
  5. NA-NP-IE系列实验13:使用子网地址
  6. 机房蓄电池在线监控重要作用
  7. 使用okhttp3执行post请求
  8. 口译务实——unit10 II
  9. php. 调试工具.trace
  10. arcgis重分类读不出值的解决办法?
  11. python期货程序化交易高手_Python版商品期货跨期对冲策略 (教学)
  12. 计算机网络教程第五版|微课版 - 第二章 物理层 - 重点概念
  13. java5兼容性,兼容性问题 (适用于 UNIX 的 Sun Java Enterprise System 5 发行说明)
  14. python实现货币的转换_Python实现制度转换(货币,温度,长度)
  15. [ERROR] [MY-012576] [InnoDB] Unable to create temporary file; errno: 30
  16. KNN实战莺尾花数据集
  17. Web自动化之Pytest测试框架
  18. 对集合进行求交集、并集、差集
  19. 【JavaScript 逆向】极验三代无感验证码逆向分析
  20. shell 脚本返回上级目录_Linux命令:使用cd和alias命令快速返回上级目录

热门文章

  1. P3384 【模板】树链剖分
  2. CentOS7静默安装oracle11g
  3. 关于添加图片到svg中,rails下使用js, 用parseFloat来调整force.on时的位置
  4. MeayunDB学习笔记(一) MeayunDB介绍及安装
  5. 2009 年 5 月 忙碌的一个月
  6. 6.2 gzip:压缩或解压文件
  7. python使用作为转义字符_当需要在字符串中使用特殊字符时, Python使用()作为转义字符。...
  8. ospf 环回口的路由条目_【网络工程师配置篇】——OSPF汇总配置!
  9. 秒懂边缘云丨快速入门边缘云
  10. 停车场事故频频,AI 达人将摄像头变身安全卫士