JavaScript中的Lexical Environment

news2024/9/22 9:35:42

概要

本文主要介绍JavaScript中的一个重要概念Lexical Environment,它可以帮助我们解释我们为什么可以通过嵌套方法,共享数据,以及为什么可以在函数中定义一个和全局变量同名的变量,并且不会影响到全局变量。

基本分析

基本概念

简单来说Lexical Environment就是一块内存空间和指向其父级的Lexical Environment的引用。

本文还会涉及一些概念如GEC,FEC等,如果要了解,可以参考本人的文章Javascript的Execution Context

代码实例

我们看如下代码:

function a(){
    var b = 10;
    c();
    function c(){
        console.log(b);
    }
}
var b = 0;
a();
console.log(b);

上面代码的指向结果如下:

在这里插入图片描述

代码分析

第一步,JS Engine 在Call Stack中创建GEC (Global Execution Context),按照Lexical Environment的定义,它是一块内存空间,已经一个指向父级的引用,GEC的Parent Lexical Environment引用为空。

下图中虚线圈出的区域即为GEC的Lexical Environment

在这里插入图片描述

第二步,开始执行全局的代码

在这里插入图片描述
在 b等于10的赋值语句执行后, GEC中的变量b被赋值为10,然后该代码被JS Engine删除。

第三步,建立a的函数执行上下文FEC,FEC中的Lexical Environment除了保留本地变量b和c函数的定义以外,还有一个指向GEC的Lexical Environment的引用;

在这里插入图片描述

第三步,开始逐行执行a方法,在执行了对b的赋值语句后,b在本地FEC中被修改成了10,然后调用c函数,为c函数建立FEC

在这里插入图片描述
在执行c方法的console.log时候,在c方法的FEC中并没有b,所以根据其Lexical Environment的父级引用关系,在b方法的FEC中找到b变量,因此会打印10;

第四步,c方法执行完毕,JS Engine将其FEC从从Call Stack中删除;

在这里插入图片描述

第五步,a方法执行完毕,JS Engine将其FEC从从Call Stack中删除;
在这里插入图片描述

第六步,执行全局的console.log(b);,b变量在GEC中的值依旧是0,并没有修改,所以打印的还是0。

结论

Lexical Environment实际上就是GEC和不同的FEC的联接纽带,有了它,存在嵌套关系的方法直接就可以共享其FEC,从而实现数据的共享。

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

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

相关文章

国产之光?Kimichat大模型200万字超长上下文突破

Kimi Chat简介 Kimi是AI大模型初创企业月之暗面(Moonshot)推出的AI产品。近日月之暗面宣布Kimi 智能助手在长上下文窗口技术上再次取得突破,无损上下文长度提升了一个数量级到200万字。 月之暗面(Moonshot AI)&#…

leetcode刷题(javaScript)——BFS广度优先遍历相关场景题总结

广度优先搜索(BFS)在JavaScript编程中有许多实际应用场景,特别是在解决图、树等数据结构相关问题时非常常见。在JavaScript中,可以使用队列来实现广度优先搜索算法。通过将起始节点加入队列,然后迭代地将节点的邻居节点…

鸿蒙Harmony应用开发—ArkTS-全局UI方法(文本滑动选择器弹窗)

根据指定的选择范围创建文本选择器,展示在弹窗上。 说明: 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 本模块功能依赖UI的执行上下文,不可在UI上下文不明确的地方使用&#xf…

python中医学习服务管理系统flask-django-php-nodejs

随着世界经济信息化、全球化的到来和互联网的飞速发展,推动了各行业的改革。若想达到安全,快捷的目的,就需要拥有信息化的组织和管理模式,建立一套合理、动态的、交互友好的、高效的中医学习服务管理系统。当前的信息管理存在工作…

三星再造AI家电的标杆,一次“实用主义”的胜利

作者 | 曾响铃 文 | 响铃说 随着以「智能科技,创享生活」为主题的2024AWE如期而至,上千家参展商带着自家产品登台唱戏,也让来到现场的观众大饱眼福。 作为中国家电及消费电子产业的风向标,AWE向来也是品牌方大秀肌肉的舞台&…

【Internet结构和ISP,分组延时、丢失和吞吐量】

文章目录 一、Internet结构和ISP1.互联网络结构:网络的网络2.Internet 结构:network of networks 二、分组延时、丢失和吞吐量1.分组丢失和延时是怎样发生的?2.四种分组延时3.分组丢失4.吞吐量 一、Internet结构和ISP 1.互联网络结构&#x…

python 教你如何创建一个自定义库 colorlib.py

目录 Colorlib 生成代码 模块代码 导入测试 测试一 测试二 应用测试 颜色列表 colorList 随机颜色元组 randcolorTuples 随机颜色字串 randcolorStrings Color类测试 测试一 测试二 题外话 Colorlib 有没有碰到过这样的场景:写代码时想要用上丰富的色…

吃瓜Grok大模型

段子区 今年当地时间2月29日晚,马斯克闹出来一件大事——正式起诉OpenAI和Sam Altman,并要求OpenAI 恢复开源GPT-4等模型。国际流量大师我只付服马斯克和川宝!! 当大家觉得这扯皮的故事就此结束后,马斯克“不负众望”的整了一个大…

[MySQL实战] 如何定义唯一约束(唯一索引)

文章目录 一、什么是唯一约束二、如何定义唯一约束2.1、建表时定义唯一约束--方法12.2、建表时定义唯一约束--方法22.3、为已创建的表定义唯一约束 三、删除唯一约束四、问题4.1、问题1:如何为多个列定义唯一约束? 五、总结 一、什么是唯一约束 唯一约束…

C语言学习 四、选择与循环

4.1关系表达式与逻辑表达式 算术运算符的优先级高于关系运算符关系运算符的优先级高于逻辑与 和 逻辑或运算符相同优先级的运算符从左到右进行结合 【例】 表达式 5 > 3 && 8 < 4 - !0 的最终值为多少 4.2 if-else语句 4.2.1 if-else单分支语句 if判断条件&am…

使用OpenCV将图片切割成小图 及图片拼接(附python代码)

文章目录 1. 图片切割2. 图片拼接3. AcknowledgmentReference 要分割的图片如下&#xff1a; 1. 图片切割 思路也比较简单&#xff0c;代码注释比较详细&#xff0c;看代码就行。 from cv2 import cv2 import numpy as np import ospic_path .jpg # 分割的图片的位置 pic_ta…

【嵌入式——QT】QWT应用

【嵌入式——QT】QWT应用 概述步骤一步骤二步骤三代码声明代码实现图示 概述 QWT&#xff0c;全称Qt Widgets for Technical Applications&#xff0c;是一个基于Qt开发的第三方库。它主要为具有技术背景的程序提供GUI组件和一组实用类&#xff0c;用于生成各种统计图。QWT的主…

【CPP】C++11多线程

thread类 在C11之前&#xff0c;涉及到多线程问题&#xff0c;都是和平台相关的&#xff0c;比如windows和linux下各有自己的接口&#xff0c;这使得代码的可移植性比较差。C11中最重要的特性就是对线程进行支持了&#xff0c;使得C在并行编程时不需要依赖第三方库&#xff0c…

深度学习500问——Chapter04:经典网络解读(1)

文章目录 4.1 LeNet-5 4.1.1 模型介绍 4.1.2 模型结构 4.1.3 模型特性 4.2 AlexNet 4.2.1 模型介绍 4.2.2 模型结构 4.2.3 模型特性 4.3 ZFNet 4.3.1 模型介绍 4.3.2 模型结构 4.3.3 模型特性 4.4 Network in Network 4.4.1 模型介绍 4.4.2 模型结构 4.4.3 模型特性 4.1 LeNet-…

60、服务攻防——中间件安全CVE复现weblogicJenkinsGlassFish

文章目录 weblogicJbossJenkinsGlassFish weblogic 默认端口&#xff1a;7001&#xff0c;历史漏洞&#xff1a;CVE_2017_3506、CVE_2018_2893、CVE_2018_3245、CVE_2020_14882、CVE_2021_2394 Jboss 历史漏洞&#xff1a;CVE-2017-12149、CVE-2017-7504 Jenkins GlassFis…

安卓 Android Activity 生命周期

文章目录 Intro生命周期方法 & 执行顺序结论code Intro 本文提供一个测试类通过打印的方式展示在多个Activity之间互相跳转的时候&#xff0c;各个Activity的生命周期相关方法的执行顺序。 生命周期方法 & 执行顺序结论 下图出自 郭霖 《第一行代码&#xff08;第二…

深度学习pytorch——激活函数损失函数(持续更新)

论生物神经元与神经网络中的神经元联系——为什么使用激活函数&#xff1f; 我们将生物体中的神经元与神经网络中的神经元共同分析。从下图可以看出神经网络中的神经元与生物体中的神经元有很多相似之处&#xff0c;由于只有刺激达到一定的程度人体才可以感受到刺激&#xff0c…

微服务高级篇(三):分布式缓存+Redis集群

文章目录 一、单点Redis的问题及解决方案二、Redis持久化2.1 单机安装Redis2.2 RDB持久化2.3 AOF持久化2.4 RDB和AOF对比 三、Redis主从3.1 搭建Redis主从架构3.1.1 集群结构3.1.2 准备实例和配置3.1.3 启动3.1.4 开启主从关系3.1.5 测试 3.2 数据同步3.2.1 全量同步【建立连接…

Windows11企业版安装WSL2和Ubuntu发布版(避坑)

背景 win10企业版升级win11企业版后&#xff0c;安装WSL2&#xff0c;最后安装WSL的Ubuntu发布版&#xff0c;尝试网上各种方法&#xff0c;还是出现文章第三节所写的问题&#xff0c;差点被这问题搞放弃了&#xff0c;全网少有针对这个问题的答案&#xff0c;有也不顶用&…

python-pandas基础学习

可参考&#xff1a; pandas&#xff1a;http://pandas.pydata.org/docs/user_guide/10min.html 一、基础知识 DataFrame 方法&#xff0c;可以将一组数据&#xff08;ndarray、series, map, list, dict 等类型&#xff09;转化为表格型数据 import pandas as pd data {name: …