JavaScript执行上下文之词法环境和块级作用域(三)

WSL2网络配置全攻略:如何让WindowsLinux子系统互相访问端口(附防火墙设置) 本文深入解析WSL2的网络架构,并提供详细的端口互通配置指南。针对WSL2与Windows宿主机之间常见的网络访问问题,文章从原理出发,逐步讲解如何识别网络环境、配置Windows防火墙规则、调整服务监听地址,并介绍镜像网络模式等进阶优化方案,最终实现稳定可靠的双向端口访问。 阅读详情

自从ES6更新后,js有三种作用域

  • 全局作用域
  • 函数作用域
  • 块级作用域

从执行上下文的角度来看作用域是什么?

全局作用域是全局执行上下文,函数作用域与函数执行上下文相关联

块级作用域在ES6中被介绍,它不同于以上两种作用域。

全局作用域的一个例子

最简单的方式理解块级作用域是将它与其他两中作用域比较

变量在全局作用域和函数作用域中工作相似,所以在这篇文章我们仅仅讨论全局作用域和块级作用域。

在这个例子中,我们仅有一个全局执行上下文和一个全局变量环境。

第二个apple覆盖了前一个,在程序执行后,这里仅仅只有一个apple变量,它的值为“banana”。

从作用域的角度,我们可以认为apple变量是在全局作用域。

块级作用域

我们可以通过let来重写上面的例子来介绍一种新的作用域--块级作用域

控制台打印两个不同的值,第一个apple变量保存的值为“apple”,而在if条件语句块中的apple变量值为“banana”。

为什么我们有两个同名的变量?

词法环境(Lexical environment)

让我们通过两个步骤来揭秘它是如何工作的

在编译阶段,值为undefined的apple变量被添加进全局执行上下文中

此刻,js引擎决定跳过第二个apple变量因为如下两个原因:

  • 它是一个let创建的变量
  • 它在一个块级作用

接下来,执行阶段开始,第一个apple变量被赋值为“apple”。

当读到if代码块时,一个嵌套的编译步骤发生。第二个值为undefined的apple变量被创建。

这个apple变量被添加到词法环境,而不是在变量环境中创建它。

马上,在词法环境中,一个“banana”值被被赋值到apple变量。

现在,我们有两个同名变量被管理在两个环境中,那就是js引擎如何处理let声明,并且它向前兼容var。

词法环境中的作用域栈

为了更好地理解let和var之间的不同,让我们将他们合并在一个有趣的例子中。

在编译阶段,apple和grape变量在变量环境中被初始化,grape初始化被提升。与此同时,banana变量在词法环境中被创建。

执行阶段开始,变量apple被赋值为“global apple”,而banana值为“global banana”。

是时候关注代码块里的变量了

它是另一个banana变量,在同一个词法环境里能够有两个相同名字的banana变量吗?

当在块级作用域里看见let或const声明的变量时,js引擎会为分别它们创建一个分开的区域,词法环境会为它内部的变量维护一个类似与栈的结构,所以同名变量不会相互冲突。

在这里,变量banana和orange放置在一个单独的作用域

接下来,所有的变量被分配一个相关的值。

执行完最后的赋值语句后,所有的变量准备完毕。

当打印第一个变量时,js引擎首先尝试在词法环境中从顶部到底部查找apple变量,然后它检查全局变量环境并找到apple变量,打印“global apple”。

当搜索banana变量时,js引擎根据同样的步骤,找到它并打印“block banana”。

此刻,代码块里没有更多可执行的代码了,所以块级作用域被移除。

脚本继续执行,在全局变量环境里找到banana和grape变量并相应地打印“global banana”和“global grape”。

当脚本查找orange变量时,这个变量不存在于任何地方,因为orange存在的作用域已经被移除。所以会抛出错误“orange is not defined”。

整个脚本执行完毕。

除了作用域,这里还有其他与let和const相关的问题吗?

创建,初始化和赋值的技巧

从编译到执行,一个变量经历三个步骤:

  • 创建
  • 初始化
  • 赋值

上面的代码将会打印什么?是“apple”?或者是“banana”?

出人意料,它会报错“Cannot access applebefore initialization”

这个错误与提升有关。

  • 对于一个let声明的变量,它的创建会被提升,但是初始化和赋值不会被提升。
  • 对于一个var声明的变量,它的创建和初始化会被提升,赋值不会被提升。
  • 对于一个函数,它的创建,初始化和赋值在同一时间都被提升。

人们把代码初始化之前的区域称为暂时性死区

  • 如果你尝试在一个变量创建之前访问它,你将会看见一个错误“[variable name] is not defined.”
  • 如果你决定在一个变量初始化之前访问它,你将会看见错误“Cannot access [variable name] before initialization.”
  • 如果你在一个变量赋值之前打印它,你将会看见打印undefined。

总结:

  • 词法环境是执行环上下文组成的另一个部分
  • let和const声明的变量在块级作用中是在执行阶段被创建而不是编译阶段中被创建。
  • 这些变量存储在词法环境中。
  • 多个块级作用域在词法环境中是维护在一个类似栈的结构中。
  • 当js引擎执行完块级作用域中所有的代码,let和const声明的相关变量会被移除。
基于HPM5E00的EtherCAT从站开发实战:从硬件解析到软件调试 实时工业以太网通信是工业自动化与运动控制领域的核心技术,它通过硬件与协议栈的协同,实现了微秒级的高确定性数据交换。其技术价值在于为多轴同步、机器人控制等复杂场景提供了高实时性、高同步精度的通信基础。在应用场景上,广泛服务于数控机床、包装机械、半导体设备等高端制造领域。本文聚焦于EtherCAT从站开发,深入解析了基于先楫HPM5E00高性能MCU与专用从站控制器(ESC)的硬件架构设计,并详细阐述了开源协议栈SOES的移植、对象字典配置以及过程数据(PDO)映射等核心软件实践,为开发者快速构建稳定可靠的实时 阅读详情

相关推荐

Cocos Creator实战:5步搞定棋牌游戏大厅场景开发(附完整代码)

本文详细介绍了使用Cocos Creator 3.8开发棋牌游戏大厅的5个关键步骤,包括工程配置、动态UI系统实现、核心交互功能开发、性能优化及调试发布技巧。通过模块化代码实战案例,帮助开发者快速构建高交互性的棋牌游戏大厅,提升用户留存率。

weixin_29002209的博客 323

执行上下文词法环境

可以理解为当前代码的运行环境,同一个函数在不同环境中运行,会因为访问的数据不同导致产生不一样的结果,你可以抽象为一个执行代码的地方或者是抽象为内部对象用来描述代码的执行环境,包含代码执行时的信息,该环境由js引擎构建。也叫执行上下文栈,是一种LIFO的数据结构(后进先出),用于存储执行上下文,用于追踪执行环境执行。js引擎首次遇到时,会创建全局上下文并压入栈顶,然后每次执行函数都会创建新的上下文压入栈中,执行完后,执行上下文从栈顶弹出。以下有上下文。.........

androidioskl的博客 566

基于ESM3微调的抗菌肽生成器:技术方案与实现

基于ESM3微调的抗菌肽生成器:技术方案与实现 摘要 本文提出了一种基于ESM3蛋白质语言模型的抗菌肽生成框架,采用两阶段训练策略:先在151万肽序列上预训练,再在1.3万抗菌肽数据上微调。模型能够生成具有合理长度分布、低重复率且高新颖性的抗菌肽序列。文章详细介绍了数据预处理流程、模型架构设计、训练策略及评估方法,为抗菌肽的理性设计提供了有效的计算工具。实验结果表明,该方法生成的抗菌肽序列在保持生物活性的同时具有较高的结构多样性。 关键词:抗菌肽设计;蛋白质语言模型;ESM3;深度学习;序列生成

huanghm88的专栏 153

JS词法环境执行上下文

JavaScript是一门解释性动态语言,但同时它也是一门充满神秘感的语言。如果要成为一名优秀的JS开发者,那么对JavaScript程序的内部执行原理要有所了解。本文以最新的ECMA规范中的第八章节为基础,理清JavaScript词法环境执行上下文的相关内容。这是理解JavaScript其他概念(let/const暂时性死区、变量提升、闭包等)的基础。本文参考的是最新发布的第十代ECMA-262标准,即ES2019。

hellocoder2029的博客 620

JavaScript执行机制之执行上下文

title: js执行上下文 前言:JavaScript没有块级作用域 开始之前,必须先声明,JavaScript 没有块级作用域,只有执行上下文。这也是这篇文章的输出原因之一,讲清楚作用域执行上下文的关系。 请不要简单的把一个 {} 当成一个块级作用域,这是错误的! 多数人的入门语言是 C语言, 它可以在 for循环 里定义变量不影响外部环境。 但在 JavaScript 中却不可以。 JavaScript 中只有全局作用域函数作用域。而执行上下文,就是函数作用域中的 JavaScript 代码的运.

a546598185的博客 689

【前端精进之路】JS篇:第3期 执行上下文_前端 执行上下文(ec)

outer: //因为是函数环境环境记录器还包含了一个传递给函数的arguments对象。VariableEnvironment: { // 变量环境。VariableEnvironment: { //变量环境。LexicalEnvironment: { //词法环境。EnvironmentRecord: { //环境记录器。EnvironmentRecord: { //环境记录器。LexicalEnvironment: { //词法环境。EnvironmentRecord: { //环境记录器。

2401_84181403的博客 1117

执行上下文作用域

JavaScript执行语句前,是需要经过了一些列的“准备”的, 为代码执行创造一个执行上下文,就好像老师上课前要有,教室一样本节课重点放在文本环境文本环境相当于我们教室的点名册,为上课做准备。文本环境为代码执行做准备。代码在执行之前,变量名,函数名,类名,登记在文本环境里,在js执行的时候就可以在文本环境中查找变量,函数,类那么js在哪里去找执行上下文呢?(只有找到了执行上下文才能找到文本环境里的变量,函数,类,)答案就是在执行栈里找到执行上下文

pacong的博客 312

js 闭包执行上下文到底是怎么回事?

js 闭包执行上下文

半夏_2021的博客 268

js 图解变量环境词法环境执行上下文,作用域链查找过程

看到这个标题的时候心里应该是这样的 js代码运行过程 编译是把代码拿过来创建执行上下文,并创建变量环境词法环境、可执行代码,将执行上下文压入执行栈。 执行是在当前执行上下文环境执行执行代码。 变量环境:通过var声明或function(){}声明的变量存在这里 词法环境:通过let const with() try-catch创建的变量存在这里 可执行代码:变量声明提前后,剩下的...

一袋米要扛几楼_ 4204

深入理解 JavaScript 作用域:从执行上下文词法环境的底层机制解析

本文将从 JavaScript 引擎执行过程入手,深入解析作用域、作用域链、变量提升、TDZ、块级作用域栈等底层机制。阅读完成后,你会真正理解 JS 为什么“看上去怪怪的”,以及 ES6 如何弥补历史缺陷。

2401_88920300的博客 1307

JavaScript执行机制——块级作用域

块级作用域作用域(scope)变量提升所带来的问题变量容易在不被察觉的情况下被覆盖掉本应销毁的变量没有被销毁ES6 是如何解决变量提升带来的缺陷JavaScript 是如何支持块级作用域的 作用域(scope) 为什么 JavaScript 中会存在变量提升这个特性,而其他语言似乎都没有这个特性呢?要讲清楚这个问题,我们就得先从作用域讲起。 作用域是指在程序中定义变量的区域,该位置决定了变量的生命周期。通俗地理解,作用域就是变量与函数的可访问范围,即作用域控制着变量函数的可见性生命周期。 在 ES6 之

前端探险家的博客 2909

也来谈谈JS的执行上下文词法环境

JS 的执行上下文(execution context)词法环境(Lexical environment)是很多前端er时不时听到,却不曾深入了解的知识点。似乎只具理论意义,也不会影响我们日常编程。事实上,**词法环境的原理与我们常常用到的很多知识点息息相关,比如变量提升,闭包(closure),作用域链(scope),箭头函数的原理等等**。这些看似散乱甚至很多同学需要背诵的知识点,其实根本上都是JS词法规则的外化与延伸。

辰辰沉沉大辰沉 1522

词法环境&变量环境

什么,你还不清楚JS执行机制?!

weixin_62061392的博客 865

深入JavaScript之JS引擎如何执行JS代码

我们大概经常能听到“执行环境”、“作用域”、“原型(链)”、“执行上下文”等内容,它们都在描述什么? JS代码的运行 我们知道了js是弱类型语言,在运行时才确定变量类型。js引擎在执行js代码时,也会从上到下进行 词法分析、语法分析、语义分析 等处理,并在代码解析完成后生成AST(抽象语法树),最终根据AST生成CPU可以执行的机器码并执行。 除此之外,JS引擎在执行代码时还会进行其它处理,如 V8 中还有两个阶段: 编译阶段:该阶段会进行执行上下文的创建,包括创建变量对象、建立作用域链、确定 this

flying meng的菜鸟居 5342

深入理解JS的执行上下文词法作用域闭包()

本文将深入探讨执行上下文词法作用域闭包的概念📝,帮助读者更好地理解这些关键的编程概念。通过具体示例详细讲解,我们将揭示它们在 JavaScript 中的工作原理应用场景。在JavaScript中,执行上下文(Execution Context)是ECMAScript规范中的一个概念,它定义了代码执行时的环境JavaScript中的执行上下文分为两种:全局执行上下文函数执行上下文

你若盛开,清风自来 1577

js执行上下文、this绑定、词法环境变量环境的理解

上下文执行栈: 执行上下文指的是js代码执行时候的环境,根据js代码执行环境分为全局执行上下文、函数执行上下文eval执行上下文执行上下文部分组成:this绑定、词法环境、变量环境。 This绑定: This值绑定跟js的抽象类型Reference有关。 //抽象Reference类型的伪代码表示: var aRef = { base: name: strict reference: //严格模式是否开启 } This值确定的步骤: 将()函数调用前面的js表达式的结果赋值

weixin_43171692的博客 804

深入理解JS的执行上下文词法作用域闭包()

JavaScript中,执行上下文词法作用域闭包之间存在一些复杂的关系。下面详细解释这些关系:执行上下文执行上下文JavaScript中变量、函数对象等执行时的上下文环境JavaScript中,执行上下文主要包括全局执行上下文(Global Execution Context)函数执行上下文(Functional Execution Context)。全局执行上下文包含全局作用域中的变量、函数对象等。函数执行上下文则包含函数词法作用域中的变量、函数对象等。当执行一段代码时,

你若盛开,清风自来 1295

JavaScript 执行上下文深度解析

执行上下文是代码执行的基础环境,包含变量环境词法环境this绑定。调用栈管理上下文执行顺序,遵循后进先出原则。作用域链通过词法环境的outer引用实现变量逐级查找。闭包是函数与其定义时词法环境的结合,通过保留作用域链实现跨作用域访问。

七公子77的技术博客 1504

深入理解JavaScript执行上下文词法环境

一、执行上下文词法环境 1. 什么是执行上下文 执行上下文是评估执行 JavaScript 代码的环境的抽象概念。 2. 执行上下文的类型 全局执行上下文   任何不在函数内部的代码都在全局上下文中。它会执行两件事:创建一个全局的 window 对象(浏览器的情况下),并且设置 this 的值等于这个全局对象。一个程序中只会有一个全局执行上下文。 函数执行上下文 每当一个函数被调用的时候,都会为该函数创建一个函数执行上下文。函数上下文可以由任意多个。每当一个新的执行上下文被创建,它会按定义的顺序(将在

qq_41884544的博客 528

javascript(JS)高级进阶(六)作用域、执行上下文词法环境

JS 执行上下文 1、 代码位置 全局代码 函数(局部)代码 2、全局执行上下文执行全局代码前将window确定为全局执行上下文 对全局数据进行预处理 var定义的全局变量 --> undefined ,添加window 属性 function 声明的全局函数 --> 赋值(fun) ,添加window方法 this --> 赋值(window) 开始执行全局代码 3、函数执行上下文 在调用函数,准备执行函数体之前,创建对应的函数执行上下文对象 对局部数

秋天,黄叶坠地,凉风有信。 931

javascript执行上下文

执行上下文可以说是js代码执行的一个环境,存放了代码执行所需的变量,变量查找的作用域链规则以及this指向等。同时,它也是js很底层的东西,很多的问题如变量提升、作用域链闭包等都可以在执行上下文中找到答案,所以这也是我们学习执行上下文的原因因为执行上下文是在编译阶段创建的,所以接下来先看一下js代码的执行过程吧。...

Lin__hr的博客 3870

模拟电子技术—模电笔记.pdf

南京理工大学电光学院大二下学期3.5学分模电课程笔记,notability导出PDF版本,适合打印出来看本人在吴少琴老师班,期末模电93,笔记针对性强,备战期末fighting!! !

TDS水质检测模块全套开发资料:含STM32/51/Arduino驱动、Zigbee通信示例与校准曲线

这套TDS传感器模块资料专为嵌入式水质检测项目准备,包含硬件探针说明书、TDS标准校准曲线图、用户手册PDF,以及多平台可直接运行的测试代码:STM32标准外设库工程、传统51单片机C51例程、Arduino Uno兼容代码。还额外提供基于CC2530 Zigbee芯片的无线传输参考实现(含协议栈压缩包),方便构建远程水质监测网络。所有资料均围绕探针式TDS传感器展开,覆盖信号采集、AD转换、温度补偿、浓度换算及串口输出全流程,适合快速验证传感器性能或集成到实际产品中。

上一篇: JavaScript执行上下文之调用栈和多执行上下文(二)
下一篇: JavaScript执行上下文之作用域链,闭包和this(四)
feral_coder
博客等级 码龄9年 19粉丝 80原创
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值