JS基础之作用域链

JS基础之作用域链

  • 作用域链
    • 作用域链
    • 函数创建
    • 函数激活
    • 总结

作用域链

当JavaScript代码执行一段可执行的代码(execution code)时,会创建对应的执行上下文(execution context)。
对于每个执行上下文,都有三个重要的属性:

  • 变量对象(Varable object,VO)
  • 作用域链(Scope chain)
  • this
    本节来简单了解一下作用域链

作用域链

上节变量对象我们说到,当查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,就会从父级(词法层面上的父级)执行上下文的变量对象中查找,一直找到全局上下文的变量对象,也就是全局对象,这样由多个执行上下文的变量对象构成的链表就叫做作用域链

函数创建

我们在词法作用域和动态作用域中讲到,函数的作用域在定义函数的时候就决定了。
这是因为函数有一个内部属性[[scope]],当函数创建的时候,就会保存所有父变量对象到其中,你可以理解[[scope]]就是所有父变量对象的层级连,但是注意[[scope]]并不代表完整的作用域链!
举个栗子:

function foo(){function bar(){...}
}

函数创建时,各自的[[scope]]为:

foo.[[scope]]=[globalConext.VO
];
bar.[[scope]] = [fooContext.AO,globalContext.VO
];

函数激活

当函数激活时,进入函数上下文,创建VO/AO后,就会将活动对象添加到作用链的前端。
这时候执行上下文的作用域链,我们命名为Scope:

Scope = [AO].concat([[Scope]]);

至此,作用域链创建完毕。

总结

结合着之前讲的变量对象和执行上下文栈,我们来总结一下函数执行上下文中作用域链和变量对象的创建过程:

var scope = "global scope";
function checkscope(){var scope2 = "local scope";return scope2;
}
checkscope();

执行过程如下:

  1. checkscope函数被创建,保存作用域链到内部属性[[scope]]
checkscope.[[scope]] = [globalContext.VO
];
  1. 执行checkscope函数,创建checkscope函数执行上下文,checkscope函数执行上下文被压入执行上下文栈
ECStask = [checkscopeContext.AO,globalContext.VO
];
  1. checkscope函数并不立刻执行,开始做准备工作,第一步:复制函数[[scope]]属性创建作用域链
checkscopeContext = {Scope:checkscope.[[scope]],
}
  1. 第二步:用arguments创建活动对象,随后初始化活动对象,加入形参、函数声明、变量声明
checkscopeContext = {AO:{arguments:{length:0},scope2:undefined},Scope:checkscope.[[scope]],
}
  1. 第三部:将活动对象压入checkscope作用域链顶端
checkscopeContext = {AO:{arguments:{length:0},scope2:undefined},Scope:[AO,[[Scope]]]
}

6.准备工作完成,开始执行函数,随着函数的执行,修改AO的属性值。

checkscopeContext = {AO: {arguments:{length:0},scope2:'local scope'},Scope:[AO,[[Scope]]]
}
  1. 查找到scope2的值,返回后函数执行完毕,函数上下文从执行上下文栈中弹出。
ECStask = [globalContext.VO
];

好啦!本节就讲到这里啦!
拓展一个小知识:AO和VO的关系
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/220165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

恢复出厂设置后在 Android 上恢复照片的 6 种常用方法

恢复出厂设置可帮助您删除电子设备的所有信息并将其恢复到原始系统状态。但是,如果您不小心按下了恢复出厂设置按钮并从 Android 设备中删除了所有难忘的照片,该怎么办?好吧,您无需担心,因为可以通过以下一些方法来恢复…

Active Objects设计模式

Active是主动的意思,Active Object是主动对象的意思。主动对象就是拥有自己的独立线程。 Active Object模式不仅有自己的独立线程,还可以接受异步消息,并能返回处理结果。从标准的Active Objects设计入手,将一个接口的方法调用转换…

Apache Flink(十三):Flink History Server

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录

《系统架构设计师教程(第2版)》第2章-计算机系统基础知识-06-系统工程

文章目录 1 系统工程概述2. 系统工程方法2.1 霍尔的三维结构2.2 切克兰德方法2.3 并行工程法2.4 综合集成法2.5 WSR系统方法3. 系统工程的生命周期3.1 各阶段1)探索性研究阶段2)概念阶段3)开发阶段4)生产阶段5)使用阶段6)保障阶段7)退役阶段3.2 生命周期方法1)计划驱动方…

缺钱走投无路怎么办

应对财务困境的有效方式 1. 审视并制定财务计划 评估个人或家庭的财务状况,分析收入和支出。制定财务预算,优先支付必要的支出,例如食品、住房和基本生活费用。 2. 与信用机构或服务提供商协商 如果无法按时支付账单或贷款,请…

区块链的可拓展性研究【05】闪电网络

1.闪电网络:闪电网络是一种基于比特币区块链的 Layer2 扩容方案,它通过建立一个双向支付通道网络,实现了快速、低成本的小额支付。闪电网络的交易速度非常快,可以达到每秒数万笔交易,而且交易费用非常低,几…

Spring中的经典的9种设计模式

Spring中的经典的9种设计模式 大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!在编写高质量、可维护的代码时,设计模式是我们的得力工具之一。今天,让我们一同探讨Spring中的经典…

04.仿简道云公式函数实战-QLExpress基础语法

1. 前言 小伙伴大家好,在上一篇文章我们简单初探了QLExpress表达式引擎,我们简单写了一个HelloWorld的程序,并成功的运行期望的结果。在本篇文章中我们来熟悉一下QLExpress的语法,因为我们在后面简道云公式实战的时候&#xff0c…

发布 Whatsonchain 上的 BSV20 插件

我们发布了 whatsonchain 上的 BSV20 插件来验证 BSV20 代币。 对于任何交易,whatsonchain 都可以通过以下网址打开: https://whatsonchain.com/tx/{hash}我们使用此 bsv20 v21 交易 打开 Whatsonchain 。 打开whatsonchain后你会看到BSV20插件&#x…

Linux系统安装MySQL8.0版本详细教程【亲测有效】

首先官网下载安装包:https://downloads.mysql.com/archives/community/ 一、上传到安装服务器 二、解压 tar -xvf mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz三、移动位置并重新命名 mv mysql-8.0.31-linux-glibc2.12-x86_64 /usr/local/mysql四、创建mysql用户…

解密布隆过滤器:数据领域的魔法阵

解密布隆过滤器:数据领域的魔法阵 前言布隆过滤器简介基本概念:核心原理:工作方式:注意事项: 设计原理数据结构:哈希函数:高效查找原理: 误判率和容量的权衡误判率问题:容…

官宣 | HelpLook已入驻企业微信应用市场

HelpLook正式入驻企业微信第三方应用市场。 HelpLook支持自定义域名与AI站内搜索,能够帮助企业微信用户搭建所见即所得的企业知识库、产品帮助中心、用户手册、企业博客。 | 怎么找到HelpLook并开始使用 在企业微信的第三方应用就可直接搜索HelpLook,添…

虚幻学习笔记14—重叠和碰撞事件

一、前言 在开发应用当中两个物体的重叠和碰撞事件会经常用到,在虚幻中哲两个有很大的区别,在官方文档碰撞概述其实已经讲了怎样发生碰撞和重叠,但是还是遗漏不少注意事项合细节,主要文档写的太粗糙了,这也让我在使用的…

C++Weekly - Code Review: O3DE Game Engine

对宣布开源的3D游戏引擎O3DE的简单Code Review。 A Quick Look At the Source To Amazons O3DE Game Engine. (Open source 3D Engine) 之前叫做Lumberyard。 Home - O3DE 1,pull up the code on github,用的是CLion 2,先查看CMake。用的…

docker---数据卷

docker---数据卷 数据卷: 容器与宿主机之间进行数据共享 数据卷是一个供容器使用的特殊的目录,容器的目录和宿主机的目录进行映射,主机和宿主机之间都可以对目录中的文件进行修改,双发同步生效。对镜像也没有影响。宿主机到容器实现数据迁移…

区块链是个啥

区块链算是一个散尽硝烟的热点, 现在说这个,有点冷水里冒热气的感觉。 先百度一下,区块链就是一个又一个区块组成的链条。每一个区块中保存了一定的信息,它们按照各自产生的时间顺序连接成链条。这个链条被保存在所有的服务器中..…

Docker Compose入门:打造多容器应用的完美舞台

Docker Compose 是一个强大的工具,它允许开发者通过简单的 YAML 文件定义和管理多容器的应用。本文将深入讨论 Docker Compose 的基本概念、常用命令以及高级应用场景,并通过更为丰富和实际的示例代码,助您轻松掌握如何通过 Docker Compose 打…

【08】ES6:运算符的扩展

一、指数运算符 指数运算符(**)返回第一个操作数取第二个操作数的幂的结果。 x ** y2 ** 2 // 4 2 ** 3 // 8指数运算符是右结合的。 a ** b ** c 等于 a ** (b ** c)2 ** 3 ** 2 // 相当于 2 ** (3 ** 2) 512指数运算符可以与等号结合,…

数据结构和算法 - 前置扫盲

数据结构和算法 一、前置扫盲 1、数据结构分类 1.1 逻辑结构:线性与非线性 tip:逻辑结构揭示了数据元素之间的逻辑关系。 线性数据结构:元素间存在明确的顺序关系。 数据按照一定顺序排列,其中元素之间存在一个对应关系&#x…

独立完成软件的功能的测试(5. 完结总结)

独立完成软件的功能的测试(5. 完结&总结) 软件测试的基础理论 1. 什么是软件:控制计算机硬件的工具。2. 什么是软件测试:使用技术的手段,查找软件的缺陷,保证软件的质量3. 软件测试的分类1. 阶段分&am…