作用域和作用域链

简介: 作用域和作用域链

每个函数都会有自己的执行环境,当执行流进入一个函数时,函数的执行环境就会被推入一个环境栈中。同样,函数在执行完毕之后,栈会将函数环境退出,把控制权交给下一个执行环境。image.png

当函数在一个执行环境中执行时,会创建变量对象的一个作用域链。

作用域链的用途:保证对执行环境有权访问的所有变量和函数的有序访问。

image.png

作用域链的前端,始终是当前执行函数所在环境的变量对象,如果所在环境为函数(即当前函数外层环境也是函数),则将其(外层函数)的活动对象作为(内存函数的)变量对象。

作用域中的下一个变量对象来自外部环境,而再下一个变量对象则来自下一个包含环境。这样一直向外延续到全局执行环境;全局执行环境的变量对象始终是作用域链中的最后一个对象。


注意:

1.作用域链是针对于函数的变量对象而言的(也可以说是为函数的变量对象创建的);

2.作用域链本质上是一个指向变量对象的指针列表,他只引用但不包含变量对象;


拓展:延长作用域链

有些语句(例如with、try-catch中的catch)可以在作用域链的前端增加一个变量对象,该变量对象在代码执行后会被消除。也就是说,当执行流到达该语句时,作用域链就会得到加长。


我们先来了解一下with语句。

with 扩展一个语句的作用域链。

with(expression) { statement }

1.expression,该表达式会添加到执行环境的作用域链当中

2.with语句将某个对象添加到作用域链的顶部,如果在statement中有某个未使用命名空间的变量,跟作用域链中的某个属性同名,则这个变量将指向这个属性值。如果沒有同名的属性,则将拋出ReferenceError异常。

functionbindUrl () {
varqs='?debug=true';
with(location) {
varurl=location.href+qs;
  }
returnurl;
}
// 在这里,location其实是全局对象,但是使用了with语句,location对象会被放在作用域链的最前端。


我们并不推荐使用with语句,因为他容易引起混淆错误和兼容性问题,在ECMAScript5中也已经明确禁用该语句。推荐使用一个临时变量来承载你所需要的属性。

相关文章
|
6月前
|
算法 Java Python
使用Python来绘制樱花树
本文以林徽因的《你是人间的四月天》为引,将春日意象与现代职场编程艺术结合,通过Python的Turtle模块绘制分形树和花瓣图案。文章详细解析了Turtle模块的使用方法、递归算法及随机性在图形生成中的应用,展示了如何用代码创造自然美感。核心代码包含tree函数(绘制分形树)和petal函数(绘制花瓣),最终生成一幅生动的春日画卷。项目不仅帮助读者掌握Turtle绘图技巧,更激发对编程艺术的兴趣,鼓励探索数字世界的无限可能。
151 5
|
10月前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
755 7
|
11月前
|
Linux Shell 数据库
文件查找是Linux用户日常工作的重要技能介绍了几种不常见的文件查找方法
文件查找是Linux用户日常工作的重要技能。本文介绍了几种不常见的文件查找方法,包括使用`find`和`column`组合、`locate`和`mlocate`快速查找、编写Shell脚本、使用现代工具`fd`、结合`grep`搜索文件内容,以及图形界面工具如`Gnome Search Tool`和`Albert`。这些方法能显著提升文件查找的效率和准确性。
209 2
|
Ubuntu Cloud Native Unix
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker 错误
在使用WSL(Ubuntu 18.04.6)时,初学者遇到运行Docker时的错误:“Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?”。解决问题的过程包括:首先尝试通过`sudo apt-get install daemon`安装daemon,然后使用`sudo service docker start`启动Docker。通过`sudo service docker status`确认Docker已启动,并成功运行`docker
|
数据采集 存储 监控
如何进行数据收集和分析
如何进行数据收集和分析
605 1
|
运维 监控 数据可视化
高效运维的秘密武器:自动化工具链的构建与实践在当今数字化时代,IT系统的复杂性和规模不断增加,使得传统的手动运维方式难以应对日益增长的业务需求。因此,构建一套高效的自动化工具链成为现代运维的重要任务。本文将深入探讨如何通过自动化工具链提升IT运维效率,确保系统稳定运行,并实现快速响应和故障恢复。
随着企业IT架构的不断扩展和复杂化,传统的手动运维已无法满足业务需求。自动化工具链的构建成为解决这一问题的关键。本文介绍了自动化工具链的核心概念、常用工具及其选择依据,并通过实际案例展示了自动化工具链在提升运维效率、减少人为错误、优化资源配置等方面的显著效果。从监控系统到自动化运维平台,再到持续集成/持续部署(CI/CD)的流程,我们将一步步揭示如何成功实施自动化工具链,助力企业实现高效、稳定、可靠的IT运维管理。
|
测试技术 Android开发 数据安全/隐私保护
脚本 | 手机大麦网脚本使用说明
这篇文章主要针对上篇文章的代码做一个使用说明
3420 0
|
编解码 算法 异构计算
m基于CCSDS标准的LDPC编码器的FPGA实现,包含testbench,码长1024,码率0.5
在Vivado 2019.2中进行的LDPC码仿真展示了算法的良好效果。LDPC码是一种1962年由Gallager提出的稀疏校验矩阵线性分组码,利用Tanner图表示编码解码结构。CCSDS标准定义的LDPC(1024,512)码具有准循环结构,适用于空间通信,其编码通过填充信息比特和校验节点的线性组合实现。Verilog代码示例展示了TEST_encoder_top模块,用于控制LDPC编码过程,包括时钟、复位信号处理和中间数据读取。
282 1
|
Java 对象存储
Java解决InputStream流重复使用问题【100%解决】
Java解决InputStream流重复使用问题【100%解决】
|
网络协议
计算机网络 | 广播与组播
计算机网络 | 广播与组播
294 0