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

Langchain分割方式 【代码】Langchain分割方式。 阅读详情

自从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声明的相关变量会被移除。
反爬虫:对抗最新反爬技术 Cloudflare详解 本文针对Cloudflare最新反爬机制提供完整解决方案,覆盖TLS指纹、行为轨迹、设备指纹等检测场景。文章首先分析Cloudflare的三重检测体系(TLS指纹、行为指纹、设备指纹)及其拦截表现,随后提出四种绕过方案:1)使用curl_cffi模拟浏览器TLS指纹;2)通过undetected-chromedriver移除自动化特征;3)Playwright结合stealth插件模拟人类行为;4)动态请求调度策略。重点推荐轻量级Python方案curl_cffi和浏览器自动化方案Playwright-st 阅读详情

相关推荐

【SoloPi】SoloPi使用2-功能使用,录制回放

Soloπ是什么 Soloπ是一个无线化、非侵入式的Android自动化工具,公测版拥有录制回放、性能测试、一机多控三项主要功能,能为测试开发人员节省宝贵时间。 录制回放功能 Soloπ拥有录制操作的能力,用户只需要通过Soloπ执行用例步骤,Soloπ就能够将用户的操作记录下来,并且支持在各个设备上进行回放,这一切都能够在手机上独立完成。 ...

q_Catherine的博客 5828

执行上下文与词法环境

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

androidioskl的博客 569

JS词法环境和执行上下文

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

hellocoder2029的博客 623

AI 帮我写单测:pytest 覆盖率提升 40% 的协作日志

AI助力pytest测试覆盖率提升40%的实践总结 本文分享了作者通过AI协作提升Python项目测试覆盖率的实践经验。初始测试覆盖率仅45%的电商后端项目,通过系统化的AI协作策略(代码分析、场景矩阵设计、迭代优化)实现了显著改进。AI不仅生成312个高质量测试用例,更提供了测试设计思路和最佳实践建议。最终覆盖率提升至85%,发现并修复23个潜在bug,效率提升3倍。文章详细展示了用户服务、订单服务等核心模块的测试案例,以及分层Fixture设计、参数化测试等高级技巧。关键成功因素包括明确的协作边界、迭代

摘星编程的博客 3273

Python、Selenium实现问卷星自动填写(内含适配个人问卷的方法)

使用Python、Selenium实现问卷星自动填写,内含适配个人问卷的方法。

DaenCode的博客 3836

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

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

2401_84181403的博客 1121

微信自动化进阶:Python识别特定消息并自动回复(基于win32api控件操作)

本文详细介绍了如何使用Python和win32api实现微信消息的智能监控与自动回复。通过精准识别聊天记录中的特定关键词,结合多级匹配策略和性能优化技巧,构建稳定高效的自动化回复系统,适用于企业客服、个人助手等场景。

weixin_42663213的博客 441

浅谈JavaScript中执行上下文与作用域,JS解析引擎

执行上下文,JS解析引擎,作用域,作用域链

m0_63278331的博客 1450

微信小程序报错:“errno“:600001,“errMsg“:“uploadFile:fail errcode:-105 cronet_error_code:-105 error_msg:net::

uploadFile:fail errcode:-105 cronet_error_code:-105 error_msg:net::ERR_NAME_NOT_RESOLVED,uniApp微信小程序使用uni.uploadFile出现报错,微信小程序如何解决wx.uploadFile报错,如何解决这个问题,微信小程序真机报错,微信小程序报错"errno":600001,"errMsg":"uploadFile:fail errcode:-105 cronet_error_code:-105 error_m

✅ 精选推荐文章 3826

在 SAP 中,Primary Cost Element(初级成本要素)与Secondary Cost Element(次级成本要素)的核心区别、作用及业务含义可归纳如下

摘要:SAP中初级成本要素与次级成本要素的核心区别在于:初级要素必须关联FI模块的损益科目,直接影响财务报表,用于记录外部成本(如电费、薪酬);次级要素仅存在于CO模块,用于内部成本分配(如分摊、作业分配),不影响外部报表。初级要素是"外部成本入口",次级要素是"内部成本搬运工",二者共同实现成本的多维度追踪与管理。

金牌架构师 759

【ES6】JavaScript块级作用域的实现原理

【ES6】JavaScript块级作用域的实现原理

ww2727的博客 617

《YOLOv8:从入门到实战》报错解决 & 专栏答疑

《YOLOv8:从入门到实战》专栏上线后,部分同学在学习过程中提出了一些问题,笔者相信这些问题其他同学也有可能遇到。为了让大家可以更好地学习本专栏内容,笔者特意推出了该篇专栏答疑,针对同学们在学习过程中所提出的问题进行汇总记录,并不断实时更新,希望能够帮助到大家!🌈

小哥谈 1240

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

js 闭包和执行上下文

半夏_2021的博客 271

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

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

一袋米要扛几楼_ 4211

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

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

2401_88920300的博客 1318

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

前端探险家的博客 2913

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

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

辰辰沉沉大辰沉 1525

词法环境&变量环境

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

weixin_62061392的博客 870

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

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

flying meng的菜鸟居 5942

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

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

你若盛开,清风自来 1588

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

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

weixin_43171692的博客 807

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

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

你若盛开,清风自来 1314

JavaScript 执行上下文深度解析

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

七公子77的技术博客 1512

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

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

qq_41884544的博客 532

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

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

秋天,黄叶坠地,凉风有信。 932
上一篇: JavaScript执行上下文之调用栈和多执行上下文(二)
下一篇: JavaScript执行上下文之作用域链,闭包和this(四)
feral_coder
博客等级 码龄9年 19粉丝 80原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值