一、执行环境

执行环境定义了变量和函数有权访问的其他数据,决定了他们各自的行为;每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。虽然我们编写的代码无法访问这个对象,但解析器处理数据时会在后台使用它。

全局执行环境是最外围的一个执行环境,在web浏览器中,全局执行环境被认为是window对象,因此所有全局变量和函数都是作为window对象的属性和方法创建的。某个执行环境中的所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁。

每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。而在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境。

二、作用域链

当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端,始终都是当前执行代码所在环境的变量对象。作用域链中的下一个变量对象来自包含环境,而再下一个变量对象则来自下一个包含环境。这样一直延续到全局执行环境;全局执行环境的变量对象始终都是作用域链中的最后一个对象。

标识符解析是沿着作用域链一级一级地搜索标识符的过程。搜索过程始终从作用域链的前端开始,然后逐级地向后回溯,直至找到标识符为止。

每个环境都可以向上搜索作用域链,以查询变量和函数名;但任何环境都不能通过向下搜索作用域链而进入另一个执行环境。

虽然执行环境的类型总共只有两种——全局和局部(函数),但通过try-catch语句的catch块和with语句可以延长作用域链。这些语句会在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行后被移除。

js没有块级作用域

使用var声明的变量会自动被添加到最接近的环境中。在函数内部,最接近的环境就是函数的局部环境;在with语句中,最接近的环境是函数环境。如果初始化变量时没有使用var声明,该变量会自动被添加到全局环境。

三、闭包

闭包指有权访问另一个函数作用域中的变量的函数,创建闭包的常见方式,就是在一个函数内部创建另一个函数。

理解闭包:在创建函数时,会创建一个预先包含全局变量的作用域链,这个作用域链被保存在内部的[[Scope]]属性中。当调用此函数时,会为函数创建一个执行环境,然后通过复制函数的[[Scope]]属性中的对象构建起执行环境的作用域链,此后又有一个活动对象被创建并被推入执行环境的作用域链的前端。因此创建的函数的作用域链包含两个变量对象:本地活动对象和全局变量对象。一般来讲,当函数执行完毕后,局部活动对象就会被销毁,内存中仅保存全局作用域(全局执行环境的变量对象)。在另一个函数内部定义的函数会将外部函数的活动对象添加到它的作用域链中。当外部函数执行完毕后,其活动对象不会销毁,因为内部函数的作用域链仍然在引用这个活动对象。当没有变量引用内部函数时,外部函数的活动对象才会被销毁。

四、关于this和arguments

this和arguments是函数内部的两个特殊的对象。

arguments是一个类数组对象,包含着传入函数中的所有参数,该对象有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。

this对象引用的是函数据以执行的环境对象,是在函数运行时基于函数的执行环境绑定的。当在网页的全局作用域中调用函数时,this对象引用的就是window,当函数被作为某个对象的方法调用时,this等于那个对象。匿名函数的执行环境具有全局性,因此其this对象通常指向window。每个函数在搜索arguments和this这两个变量时,只会搜索到其活动对象为止,因此内部函数不可能直接访问外部函数的这两个变量。

转载于:https://www.cnblogs.com/snsart/p/8119662.html

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

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

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

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

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

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

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

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

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

  5. JS 之 (三)作用域链、闭包、面向对象

    作用域链 定义 变量在当前环境now.内部环境f1.内部深层环境f2/f3-.都起作用的现象形成了一个链条,这个链条就称为变量的"作用域链" <html> <he ...

  6. 在chrome开发者工具中观察函数调用栈、作用域链、闭包

    在chrome的开发者工具中,通过断点调试,我们能够非常方便的一步一步的观察JavaScript的执行过程,直观感知函数调用栈,作用域链,变量对象,闭包,this等关键信息的变化.因此,断点调试对于快 ...

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

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

  8. JavaScript执行环境 + 变量对象 + 作用域链 + 闭包

    闭包真的是一个谈烂掉的内容.说到闭包,自然就涉及到执行环境.变量对象以及作用域链.汤姆大叔翻译的<深入理解JavaScript系列>很好,帮我解决了一直以来似懂非懂的很多问题,包括闭包.下 ...

  9. 执行环境,作用域链,闭包

    执行环境 执行环境是JavaScript中最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为.每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存 ...

最新文章

  1. 华为交换机一次性进入多个接口_华为交换机端口的批量配置命令
  2. EasyNetQ介绍
  3. 如何用html5编写彩色同心圆,HTML5 canvas 同心圆动画
  4. python中sorted函数的作用_Python中排序方法sort、函数sorted的key参数的作用分析
  5. 常用应用层传输协议和端口
  6. java补码运算代码_计算机原码、补码、反码与java移位运算符(//)
  7. 关于图神经网络的相关学习资源的分享——网站 博客(一)
  8. C语言程序——math库的函数应用
  9. 计算机拓展名cad,CAD用到的各种文件格式有哪些
  10. python网格搜索优化参数_Python中基于网格搜索算法优化的深度学习模型分析糖尿病数据...
  11. 3D打印gcode命令大全及解析
  12. SonarQube 持续集成代码质量管理
  13. go语言:sync.Once的用法(转)
  14. 使用豆瓣镜像安装Tensorflow
  15. java pageoffice获取word数据_PageOffice实现最简单的Java导出Word中的数据
  16. Badboy录制提示脚本错误解决方案
  17. 针对Android平台播放器开源库NiceVieoPlayer倍速的开发
  18. c语言运算符 4,C语言运算符
  19. P1972 [SDOI2009] HH的项链
  20. 常用的加密有哪些?在Java中如何实现?(MD5、AES、RSA)

热门文章

  1. js弹出窗体获得焦点
  2. 2022年4月8日体检
  3. 关于python的线程安全的一些理解.
  4. ubuntu下面supertux2的玩法
  5. join操作-内联,左外联,右外联,交叉联,全联
  6. 深入理解计算机操作系统:链接笔记
  7. 训练网络指定层pytorch实现方法
  8. java 偏移符号_java中的移位运算符总结
  9. 之前安装的python环境可以删除吗-在Mac上删除自己安装的Python方法
  10. 跟踪源码运行流程---SpringMVC学习笔记(四)