如何理解JS作用域与作用域链?

“挑战杯”大赛“揭榜挂帅”赛道-baseline解析 在这个脚本中,txt文件的保存路径为'yolov7/datasets/Fatigue_driving_detection/txt_labels/',而xml文件的路径为'./label_xml/'。标注图片后的产物是会给每一个图片对应生成一个xml格式的文件,但是如果要用yolo框架去训练模型,输入的数据必须是txt格式,因此这里有一步转换格式的过程。注意看:obs这里有三个文件夹,第一个是关键帧的文件夹A,第二个是标注时输出的位置为文件夹B,第三个是智能标注后和手动标注的合集文件夹C。 阅读详情

这里是修真院前端小课堂,每篇分享文从

八个方面深度解析前端知识/技能,本篇分享的是:

【如何理解JS作用域与作用域链?】

大家好,我是IT修真院武汉分院web第17期的学员吴三水,一枚正直纯洁善良的web程序员
今天给大家分享一下,修真院官网js(职业)任务四,深度思考中的知识点——如何理解JS作用域与作用域链?

1.背景介绍
任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。
 作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理;作用域链的概念对理解闭包至关重要。

2.知识剖析
首先,我们得了解一下局部变量和全局变量:

全局变量:定义在函数外部的变量可以被叫做全局变量
全局变量对应的作用域是整个代码,即在代码的任何部分都是可以调用该变量的
如下例:

//在函数外定义了一个变量a,这个a就是这个js里的全局变量
var a = 10;
function c() {
  b = 20;
alert(a); //弹出10;
}
c();
alert(b);//弹出20.
js中规定,全局变量都可以看作是window的属性,而且全局变量能够被所有的代码块读取。
上面代码里我们虽然在函数c里对a没有定义,但是由于a是全局变量,所以其他任何的代码块都能够读取a的值。
另外,对于一个变量b来说,如果没有用var来声明的话,那么会自动认为是全局变量,因此,我们虽然是在函数里定义的b,但是在外面也能读取到b的值。

局部变量:定义在函数内部的变量;但是如果变量在函数内部没有使用var来声明,那么该变量也会被认为是全局变量。
1,局部变量对应的作用域是函数内部,只能在函数内部使用,如果在函数外部使用就会出错
2,局部变量的优先级大于全局变量,即如果全局变量和局部变量名字一样,那么在函数内部局部变量会覆盖掉全局变量。
举个栗子:

var a = 10;

function c() {
a = 20;
console.log(a);//因为局部变量的优先级,a被覆盖成了20.
var b = 20;
}
c();
console.log(b);//因为b是函数c的局部变量,如果这个方法要调用b,则会报错。
作用域链
众所周知,我们码代码要有一个写代码的开发环境IDE,同样,我们的代码在执行过程中也需要一个执行环境,每一个执行环境都有与之关联的变量对象。我们的执行环境中所有的函数和变量都保存在这个变量对象中,不过我们没法访问这个对象。

在web浏览器中,全局执行环境是最外围的一个执行环境,该环境也被认为是window对象,因此全局执行环境的变量对象就是window对象。函数也有自己的执行环境,就是该函数的内部。每当执行一个函数,就会进入该函数的执行环境。

作用域链是与执行环境相关的。在JavaScript中,“一切皆对象”,函数的对象有一个内部属性[[scope]],该内部属性指向了该函数的作用域链,而作用域链中存储了每个执行环境相关的变量对象。

每当创建(或声明)一个函数的时候,那么会创建这个函数的作用域链,而此时这个作用域链中只包含了一个变量对象(window)。如下例子和图示。

函数sum的作用域链示意图:

转存失败
重新上传
取消
以上是在创建(或声明)一个函数时会创建一个作用域链。

当函数被调用时,也就是进入到一个新的执行环境的时候,此时这个执行环境也就会有一个新的变量对象被创建,这个对象就会被存储在该函数的[[scope]]属性所指向的作用域链中,而之前的对象就被压在了新的变量对象的下边,这个可以类比栈,新的变量对象就放在了栈的最顶端,给最顶端的序号为0,向下以此类推,有点像倒金字塔模型。如下例子:

函数sum在被调用时的作用域链示意图:

转存失败
重新上传
取消

如上图所示,当sum函数一执行,他的新的活动对象会被创建,该活动对象会处于作用域链的最顶端,序号为0(金字塔顶端/倒金字塔的底端)。

当以后我们需要查找变量的时候,就总是会沿着这个作用域链的顶端(序号0/栈顶)开始查找,一直到作用域链(栈底)的末端,直到找到为止。也就是说顶端的活动对象可以访问到其后面的参数。

转存失败
重新上传
取消

如上例子,当执行sum函数时,要打印a个变量,此时会从作用域链的顶端(TOP),也就是sum函数的活动对象开始查找,找不到就向作用域链的末端(BOTTOM)查找,直到找到为止。换通俗一点的话来讲就是:
由于js存在全局变量和局部变量,在调用一个变量是,会对他的作用域链进行查找,如果函数内部定义了这个变量,那么取该变量的值,如果没有,那么向上一层查找,如果找到了,就获取这个值,如果还没找到,继续往上层查找,直到找到为止,如果找到最后也没找到,那么该变量的值为undefined。
3.常见问题
我们先来看一串代码

在这个demo中,sum的2个打印值分别是什么呢?
4.解决方案
我们首先就抛出了一个函数作用域的概念,即变量在声明它的函数以及该函数所嵌套的任意函数内都是有定义的,所以说上面的代码我们可以这样理解:
1.fun()将调用这个函数的第一个console.log(num),会对num的值进行原型链查找。
2.看函数fun内部是否进行了定义,发现在函数内部对num进行了定义,那么第一个console.log(num)将不再往上层查找。
3.由于第一个console.log(num)时,对num还没有赋值,所以,第一个console.log(num)为undefined,第二个console.log(name)为“3”!。

5.编码实战
6.拓展思考

js没有块级作用域。

看代码,js中像if,for,switch之类的语句,他们包含的代码块里面的变量,在代码块外面也能被读取,所以说,js没有块级作用域。

7.参考文献
关于js中的作用域和作用域链以及常见的问题和结果方法

浅析JavaScript中作用域和作用域链

你不得不知道的js之作用域链与闭包

2023年下半年网络工程师案例分析真题答案解析 R1] ip route-static 0.0.0.0 0.0.0.0 GigabitEthemet2/0/1 (3) track (4) R1 to R2 //配置R1的缺省路由,联动BFD使得R1到2的流量优先走R1->S1->R2链路,当此链路发生故障时,流量切换到R1->R3->R2链路上。当同一VLAN内也需要网络隔离时,我们可采用交换机的(2)功能,若在配置了二层隔离后,部分主机有互通的需求,则可在需求主机的网关上配置(3)功能。不需要,MAC地址是数据链路层封装以太帧的地址标识。 阅读详情

相关推荐

Windows下Colmap编译安装全攻略:从Boost到CUDA的避坑指南

本文详细介绍了在Windows系统下编译安装Colmap三维重建工具的完整流程与实战经验。针对Boost库版本兼容性、CUDA与Visual Studio的版本匹配等常见难题提供了具体的避坑指南和解决方案,帮助开发者高效完成从环境配置到最终部署的全过程。

weixin_28235513的博客 198

JS深入理解作用域

目录 一、什么是作用域 二、作用域 2.1、全局作用域 2.2、函数作用域 2.3、自动全局作用域 三、作用域内部原理 3.1、编译阶段 ​3.2、执行阶段 3.3、查询阶段 3.4、嵌套阶段 3.5、异常阶段 四、词法作用域 五、遮蔽效应 一、什么是作用域 作用域指一个变量的作用的范围。通常来说,一段程序代码中所用到的名字并不总是有效和可用 的,而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑 的局部性,增强了程序的可靠性,减.

mengfanshaoxia的博客 6384

TLV320AIC3204音频CODEC硬件设计与调试实战

本文深入解析了TLV320AIC3204音频CODEC的硬件设计与调试实战。文章从芯片功能定位入手,详细阐述了电源时钟设计、模拟输入电路等关键硬件设计要点,并提供了软件驱动配置与分层调试方法,帮助工程师有效规避常见陷阱,解决底噪、失真等典型音频调试问题。

zero1的博客 1122

JS作用域链详解

1、作用域 作用域是一套规则,用来确定在何处以及如何查找标识符。在 JS 中作用域分为全局作用域和函数作用域,另外函数作用域可以互相嵌套。在下面的例子中,存在着全局作用域 fn 作用域和 bar作用域,他们相互嵌套。 <script> var a = 1; var b = 2; function fn(x) { var a = 10; function bar(x) {

mengfanshaoxia的博客 1万+

电池建模 004- Battery (Table-Based)表格化电池模型入门学习

对于 Battery (Table-Based) 模块,提供了多种内置参数。该预参数化数据允许您将模块设置为代表特定供应商的组件。这些电池的参数化可以与制造数据表中的放电曲线相匹配。要加载预定义的参数化,双击 Battery (Table-Based) 模块,点击 Selected part 参数中的 超链接,然后在块参数化管理器窗口中,从可用组件列表中选择所需部件。 (默认)选项用于参数化模块,以代表特定供应商的组件。

qq_63860930的博客 2734

STM32F103到F407移植OLED,为啥F4屏幕不亮?一个延时函数搞定时序问题

本文详细分析了STM32F103到F407移植OLED时屏幕不亮的问题,指出时钟频率差异导致的时序问题是关键原因。通过对比F103和F407的时钟架构差异,提供了精确延时函数的实现方法,并指导在I2C通信关键点插入适当延时,确保OLED正常显示。文章还涵盖了完整的测试方案和高级优化技巧,帮助开发者彻底解决移植中的时序问题。

weixin_30642561的博客 549

JavaScript作用域详解

作用域是JavaScript中一个重要的概念,它决定了变量和函数在代码中的可访问性和可见性。了解JavaScript的作用域对于编写高效、可维护的代码至关重要。本文将深入介绍JavaScript作用域的不同类型、作用域链以及闭包等相关内容。

00后|互联网💻|办公室🍵茶农,希望通过技术改变生活|爱折腾💪|收集各类📚网络资源,好物不私藏,点点关注,不迷路。 全网搜:阿宇的编程之旅 or 阿宇的宝库 2726

Zotero on Mac: 高效文献管理与引用指南

本文为Mac用户提供了一份全面的Zotero高效文献管理与引用指南。从安装配置、文献收集管理、PDF深度阅读与笔记,到在Word中无缝插入引用和生成参考文献,详细讲解了核心工作流。同时推荐了ZotFile、Better BibTeX等必备插件,并介绍了利用同步与WebDAV实现跨设备无缝衔接的方法,助力研究者构建个人数字知识库,极大提升学术研究效率。

weixin_29281941的博客 1176

作用域的理解

作用域是用来存储变量,并且之后可以方便地找到这些变量的一套设计良好的规则当一个块或函数嵌套在另一个块或函数中时,就发生了作用域的嵌套。

m0_50953782的博客 182

基于粒子群优化的PID控制在药液流量控制系统中的应用

本文提出了一种基于粒子群优化(PSO)的PID控制算法,用于药液流量控制系统。系统采用C37控制器和Codesys 2.3编程环境实现,通过传感器实时监测流量、压力和车速,并控制水泵占空比和电动球阀开度来精确调节药液流量。硬件配置包括FT-2000流量传感器、PT-3000压力传感器和MV-500电动球阀等。控制算法将PSO与PID结合,使用ITAE指标优化PID参数,在Codesys中实现了包含PSO优化循环、PID控制等功能的程序模块。该系统通过分层控制策略和智能优化算法,提高了药液流量控制的精度和响应

AI的内部世界的博客 250

C#的GDI+绘图详解

/消除锯齿 或 AntiAlias。// 1.在窗体或控件的Paint事件中,用PaintEventArgs e 创建绘图对象 ---- 控件或窗体重绘时。//为控件创建绘图对象。//--------------------以上方法三选一。//2.创建绘图对象 panel1中绘图。

weixin_50920631的博客 3457

js作用域链是什么

每个函数都有自己的作用域链,而且作用域链的结构是固定的,不会随着函数的调用而改变。所以,当在函数内部定义一个新的变量时,它会被加入到该函数的变量对象中,并成为该函数作用域链的一部分。当函数执行完毕后,该函数的变量对象就会被销毁,同时也销毁了该函数的作用域链。作用域链实际上就是由当前作用域和所有外层作用域的变量对象组成的一个链表结构。当代码在作用域内访问一个变量时,JavaScript 引擎会先在当前作用域内查找该变量,如果找不到,就会逐级向上查找直到全局作用域,这个查找的过程就是作用域链。

weixin_69031161的博客 1422

华为OD机试双机位B卷 - 比赛的冠亚季军 (C++ & Python & JAVA & JS & GO)

华为OD机试双机位B卷 比赛的冠亚季军,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。 华为OD机试 比赛的冠亚季军

qq_45776114的博客 703

【JavaScript】js中说说你对作用域链的理解

引擎会尝试在当前作用域下去寻找该变量,如果没找到,再到它的上层作用域寻找,以此类推直到找到该变量或是已经到了全局作用域。可见上述代码中在函数内部声明的变量或函数,在函数外部是无法访问的,这说明在函数内部定义的变量或者方法只是函数作用域。任何不在函数中或是大括号中声明的变量,都是在全局作用域下,全局作用域下声明的变量可以在程序的任意位置访问。把作用域比喻成一个建筑,这份建筑代表程序中的嵌套作用域链,第一层代表当前的执行作用域,顶层代表全局作用域。变量,当我们在全局访问这个变量的时候,系统会报错。

一个前端开发者 298

数学建模模型总结

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

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

JavaScript关于作用域、作用域链和闭包的理解

作用域先来谈谈变量的作用域 变量的作用域无非就是两种:全局变量和局部变量。 全局作用域: 最外层函数定义的变量拥有全局作用域,即对任何内部函数来说,都是可以访问的:<script> var outerVar = "outer"; function fn(){ console.log(outerVar); } fn();//res

Hello World 5万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

JavaScript如何理解作用域链

JavaScript的作用域链包含两种类型的作用域:词法作用域和动态作用域。在这个例子中,innerFunction的作用域链包含三个作用域:innerFunction自身的作用域、outerFunction的作用域和全局作用域。当innerFunction试图访问一个变量时,它首先会在自己的作用域中查找,如果没有找到,就会继续在外层作用域中查找,直到找到变量或达到全局作用域。全局作用域中的变量和函数在任何地方都可以访问,而局部作用域(如函数内部)中的变量和函数只能在定义它们的函数内部访问。

读心悦 572

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

理解Javascript的作用域和作用域链

目录 正文 什么是作用域 作用域的类型 作用域嵌套 词法作用域 作用域链 作用域和作用域链是如何工作的 Javascript引擎是如何进行变量查找的 结论 正文 作用域和作用域链在Javascript和很多其它的编程语言中都是一种基础概念。但很多Javascript开发者并不真正理解它们,但这些概念对掌握Javascript至关重要。 正确的去理解这个概念有利于你去写更好,更高效和更简洁的代码,让你成为一个更优秀的Javascript开发者。 因此,在本文中,我将会向大家解释.

Danny 517

深入理解js原型链和作用域链,了解作用域链和原型链的区别

深入理解js原型链和作用域链,了解作用域链和原型链的区别一、原型链二、作用域链三、原型链和作用域链的区别:总结 一、原型链 每一个构造函数都有一个prototype属性,这个属性就叫原型对象。 每一个构造函数new出来的对象都有一个–proto–属性,这个属性指向原型对象。 <script> function Car(){ //实例属性: //this.produce = ‘chevrolet‘, this.price = 8

qq_43305958的博客 1332

JS作用域与作用域链的理解

转载自:https://www.cnblogs.com/Chen-XiaoJun/p/6189315.html 作用域 作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。可以说,变量和函数在什么时候可以用,什么时候被摧毁,这都与作用域有关。 JavaScript中,变量的作用域有全局作用域和局部作用域两种。 1. 全局作用域(Global Scope) 在代码中任何地方...

weixin_44593006的博客 237

js作用域链的理解

从事web开发工作的,难免会听到作用域链这个词,如果你还是似懂非懂的话,那么看这篇文章就足够了。要理解什么是作用域链,那必须先理解变量作用域,函数作用域,下面我来一一介绍。 变量作用域 在js中,变量分为全局变量和局部变量。全局变量的作用域是全局的,在任意地方都是被定义的。而局部变量可以是函数的参数、函数内定义以及{}内(ES6语法)定义,如果局部变量与全局变量重名的话,会优先取局部变量。下面我们...

weixin_43972875的博客 309

【js面试题】说说你对作用域链的理解

即使bar()函数内部有一个局部变量a,这个局部变量a只在bar()函数内部有效,它不会影响foo()函数中对变量a的查找。foo()函数在定义时,其词法作用域中已经包含了全局变量a,因此它会忽略bar()函数内部的局部变量a。由于foo()是在全局作用域中定义的,它首先会在自己的作用域(也就是全局作用域)中查找变量a。如果全局作用域中也找不到该变量,根据JavaScript的模式,非严格模式下变量会被隐式声明为全局变量,而在严格模式下则会抛出错误。在当前作用域中查找,如果未找到,它会。

859

深入理解JavaScript作用域链

要讲清楚作用域链,我们首先要从JS中的一个重要概念讲起——执行环境 执行环境与变量对象 执行环境定义了变量或者函数有权访问的其它数据。这是JavaScript高级程序设计中的定义。它是从执行环境的作用来定义执行环境这个概念的,也就是说:正是因为有了执行环境的存在,才能保证一个变量或者函数有权访问哪些数据,而无权访问哪些数据。 执行环境分两种:全局执行环境和局部执行环境。全局执行环境不用说了,在we...

weixin_34092455的博客 111

js作用域以及作用域链的理解

以前一直以为自己对作用域和作用域链了解的比较清晰,直到最近碰到一个问题的时候,才发现自己是真的傻逼了,具体问题的应用场景就不在这里说了,下面我将简单举例说明下; 示例1: var a=20; function b1(){ console.log(a); }; function b2(){ var a=40; b1(); }; b2(); 如果能够正确的写出最后的结果的朋友们请忽略本题,如果和我...

weixin_38138887的博客 1054

JavaScript作用域链的理解

前言 作用域是JavaScript一个很重要的概念,想要学好JavaScript就需要理解javascript作用域和作用域链的工作原理。这篇文章对JavaScript作用域链和作用域链做一个简单的介绍,希望能帮助大家更好的理解。 变量作用域 在js中,变量分为全局变量和局部变量。全局变量的作用域是全局的,在任意地方都是被定义的。而局部变量可以是函数的参数、函数内定义以及{}内(ES6语法)...

weixin_30532369的博客 104

理解JavaScript中的作用域与作用域链

本文将介绍JavaScript中的作用域与作用域链的概念,以及它们在变量查找和代码执行中的作用。通过了解作用域与作用域链,开发者可以更好地编写可维护和高效的代码。本文介绍了JavaScript中的作用域与作用域链的概念,以及它们在变量查找和代码执行中的作用。通过了解作用域与作用域链,开发者可以更好地编写可维护和高效的代码。

你若盛开,清风自来 1039

理解 JS 作用域链与执行上下文

贫道,感觉,JS的坑,不是一般地大。 变量提升: 变量提升( hoisting )。 我可恨的 var 关键字: 你读完下面内容就会明白标题的含义,先来一段超级简单的代码: <script type="text/javascript"> var str = 'Hello JavaScript hoisting'; console.log(str); //...

包磊磊的博客 1021
上一篇: 密 ANGULAR有哪些优缺点?
下一篇: $scope $rootScope $watch 和 $state
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值