继续上文的内容。

执行全局代码时,会产生一个执行上下文环境,每次调用函数都又会产生执行上下文环境。当函数调用完成时,这个上下文环境以及其中的数据都会被消除,再重新回到全局上下文环境。处于活动状态的执行上下文环境只有一个。

其实这是一个压栈出栈的过程——执行上下文栈。如下图:

可根据以下代码来详细介绍上下文栈的压栈、出栈过程。

如上代码。

在执行代码之前,首先将创建全局上下文环境。

然后是代码执行。代码执行到第12行之前,上下文环境中的变量都在执行过程中被赋值。

执行到第13行,调用bar函数。

跳转到bar函数内部,执行函数体语句之前,会创建一个新的执行上下文环境。

并将这个执行上下文环境压栈,设置为活动状态。

执行到第5行,又调用了fn函数。进入fn函数,在执行函数体语句之前,会创建fn函数的执行上下文环境,并压栈,设置为活动状态。

待第5行执行完毕,即fn函数执行完毕后,此次调用fn所生成的上下文环境出栈,并且被销毁(已经用完了,就要及时销毁,释放内存)。

同理,待第13行执行完毕,即bar函数执行完毕后,调用bar函数所生成的上下文环境出栈,并且被销毁(已经用完了,就要及时销毁,释放内存)。

好了,我很耐心的给大家介绍了一段简短代码的执行上下文环境的变化过程,一个完整的闭环。其中上下文环境的变量赋值过程我省略了许多,因为那些并不难,一看就知道。

讲到这里,我不得不很遗憾的跟大家说:其实以上我们所演示的是一种比较理想的情况。有一种情况,而且是很常用的一种情况,无法做到这样干净利落的说销毁就销毁。这种情况就是伟大的——闭包。

要说闭包,咱们还得先从自由变量和作用域说起。

---------------------------------------------------------------------------

本文已更新到《深入理解js原型和闭包》的目录更多内容可参考《深入理解js原型和闭包》

最新文章

  1. mvc SelectList selected失效的解决方法
  2. C++ 为什么拷贝构造函数参数必须为引用?赋值构造函数参数也必须为引用吗?
  3. Maven 跳过测试目录
  4. 云极知客开放平台接口调用方法(C#)
  5. Apache代理和反向代理
  6. 基于XMPP的即时通信系统的建立(一)— XMPP基础概念
  7. 【转】android Apk打包过程概述_android是如何打包apk的
  8. codevs 3119 高精度练习之大整数开根 (各种高精+压位)
  9. Spark Executor Driver资源调度小结【转】
  10. 【转】简析SynchronousQueue,LinkedBlockingQueue,ArrayBlockingQueue
  11. libcurl使用示例
  12. MATLAB的符号运算基础
  13. Git添加远程库和从远程库中获取(新手傻瓜式教学)
  14. 最近用spring4.x整合Jackson------>java.lang.ClassNotFoundException:
  15. Binary Search 的递归与迭代实现及STL中的搜索相关内容
  16. JS 面向对象 ~ 继承的7种方式
  17. 其他shell
  18. 【ASP.NET】 HttpContext.Current.User.Identity.Name 返回值为空
  19. hive安装详解
  20. Hive思维导图

热门文章

  1. NavigationView更改菜单icon和title颜色变化效果
  2. codeforces 451C. Predict Outcome of the Game 解题报告
  3. Mysql语句示例
  4. hdu 1286 找新朋友(欧拉函数)
  5. 关于JQuery获取元素索引值的理解
  6. BZOJ_4609_[Wf2016]Branch Assignment_决策单调性+带权二分
  7. angularJS 的双向数据绑定
  8. 通用异步 Windows Socket TCP 客户端组件的设计与实现
  9. PYTHON路线图
  10. idea类名下有红色波浪线