深入理解javascript原型和闭包(13)-【作用域】和【上下文环境】
来源:互联网 发布:灰度共生矩阵14个特征 编辑:程序博客网 时间:2024/05/22 09:51
如上图,除了全局作用域之外,每个函数都会创建自己的作用域,作用域在函数定义时就已经确定了。而不是在函数调用时确定。
下面我们将按照程序执行的顺序,一步一步把各个上下文环境加上。
第一步,在加载程序时,已经确定了全局上下文环境,并随着程序的执行而对变量就行赋值。
第二步,程序执行到第27行,调用fn(10),此时生成此次调用fn函数时的上下文环境,压栈,并将此上下文环境设置为活动状态。
第三步,执行到第23行时,调用bar(100),生成此次调用的上下文环境,压栈,并设置为活动状态。
第四步,执行完第23行,bar(100)调用完成。则bar(100)上下文环境被销毁。接着执行第24行,调用bar(200),则又生成bar(200)的上下文环境,压栈,设置为活动状态。
第五步,执行完第24行,则bar(200)调用结束,其上下文环境被销毁。此时会回到fn(10)上下文环境,变为活动状态。
第六步,执行完第27行代码,fn(10)执行完成之后,fn(10)上下文环境被销毁,全局上下文环境又回到活动状态。
最后我们可以把以上这几个图片连接起来看看。
连接起来看,还是挺有意思的。作用域只是一个“地盘”,一个抽象的概念,其中没有变量。要通过作用域对应的执行上下文环境来获取变量的值。同一个作用域下,不同的调用会产生不同的执行上下文环境,继而产生不同的变量的值。所以,作用域中变量的值是在执行过程中产生的确定的,而作用域却是在函数创建时就确定了。
所以,如果要查找一个作用域下某个变量的值,就需要找到这个作用域对应的执行上下文环境,再在其中寻找变量的值。
以上代码中,还没有设计到跨作用域取值的情况,即——自由变量。
- 深入理解javascript原型和闭包(13)-【作用域】和【上下文环境】
- 深入理解javascript原型和闭包(13)-【作用域】和【上下文环境】
- 深入理解javascript原型和闭包(13)-【作用域】和【上下文环境】
- 深入理解javascript原型和闭包(13)-【作用域】和【上下文环境】
- 深入理解javascript原型和闭包(13)-【作用域】和【上下文环境】
- 深入理解javascript原型和闭包(13)-【作用域】和【上下文环境】
- 深入理解javascript原型和闭包(13)-【作用域】和【上下文环境】
- 深入理解javascript原型和闭包(13)-【作用域】和【上下文环境】
- 深入理解javascript原型和闭包(13)-【作用域】和【上下文环境】
- 深入理解javascript原型和闭包(13)-【作用域】和【上下文环境】
- 深入理解javascript原型和闭包(13)-【作用域】和【上下文环境】
- 深入理解javascript原型和闭包(13)--作用域和上下文环境
- 深入理解javascript原型和闭包系列 深入理解javascript原型和闭包(13)-【作用域】和【上下文环境】
- 深入理解javascript原型和闭包系列 系深入理解javascript原型和闭包(17)——补充:上下文环境和作用域的关系
- 深入理解javascript原型和闭包(18)——补充:上下文环境和作用域的关系
- 深入理解javascript原型和闭包(18)——补充:上下文环境和作用域的关系
- 深入理解javascript原型和闭包(16)——补充:上下文环境和作用域的关系
- 深入理解javascript原型和闭包(18)——补充:上下文环境和作用域的关系
- iOS应用内部实现App Store评分功能
- 下一代区块链技术 | 硅谷线下活动
- 笔记本电脑i7和i5有什么区别
- HTML5基础知识2
- idea创建spring boot项目
- 深入理解javascript原型和闭包(13)-【作用域】和【上下文环境】
- WEB项目部署到服务器,验证码无法刷新
- Rosonblatt线性感知器
- LINTCODE——Number of Subsequences of Form a^i b^j c^k
- ucgui按键工作的流程
- RK3399(2)
- Android Studio 导入 Sweet-alert-dialog
- SpringCloud 教程 | 第二篇: 服务消费者(rest+ribbon)
- iOS蓝牙原生封装,助力智能硬件开发