博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入理解javascript原型和闭包(13)-【作用域】和【上下文环境】
阅读量:7298 次
发布时间:2019-06-30

本文共 905 字,大约阅读时间需要 3 分钟。

hot3.png

上文简单介绍了作用域,本文把作用域和上下文环境结合起来说一下,会理解的更深一些。

如上图,我们在上文中已经介绍了,除了全局作用域之外,每个函数都会创建自己的作用域,作用域在函数定义时就已经确定了。而不是在函数调用时确定。

下面我们将按照程序执行的顺序,一步一步把各个上下文环境加上。

第一步,在加载程序时,已经确定了全局上下文环境,并随着程序的执行而对变量就行赋值。

第二步,程序执行到第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)上下文环境被销毁,全局上下文环境又回到活动状态。

结束了。像老太太的裹脚布——又臭又长!
最后我们可以把以上这几个图片连接起来看看。

连接起来看,还是挺有意思的。作用域只是一个“地盘”,一个抽象的概念,其中没有变量。要通过作用域对应的执行上下文环境来获取变量的值。同一个作用域下,不同的调用会产生不同的执行上下文环境,继而产生不同的变量的值。所以,作用域中变量的值是在执行过程中产生的确定的,而作用域却是在函数创建时就确定了。

所以,如果要查找一个作用域下某个变量的值,就需要找到这个作用域对应的执行上下文环境,再在其中寻找变量的值。
虽然本文很长,但是文字较少,图片居多,图片都有形象的展示,大家花十几分钟也能慢慢看完。但是,这节内容真的很重要。
以上代码中,咱们还没有设计到跨作用域取值的情况,即——自由变量。详细内容且听下回分解。

 

转载于:https://my.oschina.net/duanvincent/blog/1550706

你可能感兴趣的文章
eslint
查看>>
2019福建省队集训day2T3排序sort
查看>>
Web应用程序系统的多用户权限控制设计及实现-页面模块【9】
查看>>
我的vim 配置(python)
查看>>
MySQL中文乱码解决方法(原创)
查看>>
php封装文件上传
查看>>
eclipse中的Java项目导出成为一个可以直接双击运行的jar文件
查看>>
centos7.3安装RabbitMQ
查看>>
【转】ORACLE的REDO与UNDO
查看>>
python 格式化输出之%号
查看>>
VS2015配置使用Sqlite以及EF6框架记录
查看>>
C#获取本机所有IP地址(包括局域网和本机外网IP)
查看>>
【leetcode】Valid Triangle Number
查看>>
微信扫二维码缓存的问题
查看>>
getContext() , getApplicationContext() , getBaseContext() and “this”的区别
查看>>
C# int数组转string字符串
查看>>
引用是具有特殊语义的指针
查看>>
maven配置默认jdk版本
查看>>
IOS-网络SOCKET操作
查看>>
【poj解题】1308
查看>>