首页
学习
活动
专区
圈层
工具
发布

【JavaScript】作用域 ③ ( JavaScript 作用域链 | 作用域链变量查找机制 )

一、JavaScript 作用域链 1、作用域 在 JavaScript 中 , 任何代码都有 作用域 , 全局作用域 : 在 标签中 或者 js 脚本中 定义的变量 属于 全局作用域...之前使用 var 关键字在 {} 代码块 中定义的变量 , 取决于 代码块位置 , 代码块在全局作用域 则 该变量属于全局作用域 , 代码块在 局部作用域 则该变量属于 局部作用域 ; 2、作用域链 如果在...确定取哪个值 , 这种作用域结构 称为 " 作用域链 " ; 内部函数 , 外部函数 , 全局变量 中 , 定义的变量名称 可能是相同的 , 给定一个变量名 , 需要从作用域链中具体查找 作用域链 是...JavaScript 的重要的概念 , 用于 查找 变量名 对应的 不同作用域的 变量 ; 当 JavaScript 代码 执行时 , 会创建变量对象的 作用域链 , 其用途是保证对执行环境有权访问的所有变量和函数的有序访问...; 3、作用域链变量查找机制 在 JavaScript 代码中 的 嵌套作用域 中 , 查找 变量 或 函数 的 机制就是 作用域链 的 链式查找机制 ; 内部函数 在 访问 指定名称的 变量时 ,

35310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JavaScript作用域及作用域链

    静态作用域 作用域 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。 JavaScript 采用词法作用域(lexical scoping),也就是静态作用域。...因为 JavaScript 采用的是词法作用域,函数的作用域在函数定义的时候就决定了。 而与词法作用域相对的是动态作用域,函数的作用域是在函数调用的时候才决定的。...总之一句话: 函数的作用域在函数定义的时候就决定了 函数会沿着作用域链去查找变量。 那么为什么 JavaScript 是静态作用域呢?JavaScript 引擎是怎么处理函数的呢?...对于每个执行上下文,都有三个重要属性: 变量对象(Variable object,VO) 作用域链(Scope chain) this JavaScript 引擎会沿着作用域链去查找变量。...作用域链是如何产生?我们应该先了解 JavaScript 引擎 在创建 执行上下文 的具体处理过程。

    1.9K40

    理解javascript作用域和作用域链

    作用域 作用域就是变量和函数的可访问范围,控制着变量和函数的可见性与生命周期,在JavaScript中变量的作用域有全局作用域和局部作用域。    ...全局和局部作用域下面用一张图来解释: ? 单纯的JavaScript作用域还是很好理解的。...当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain)来保证对执行环境有权访问的变量和函数的有序访问。     用一张图来解释作用域链的运行:由里向外执行。 ?    ...每个运行期上下文都有自己的作用域链,用于标识符解析,当运行期上下文被创建时,而它的作用域链初始化为当前运行函数的[[Scope]]所包含的对象。        ...这些值按照它们出现在函数中的顺序被复制到运行期上下文的作用域链中。

    2.2K10

    理解JavaScript作用域和作用域链

    ​一、JavaScript中的作用域 作用域是当前的执行上下文,值和表达式在其中“可见”或可被访问。如果一个变量或表达式不在当前的作用域中,那么它是不可用的。...function foo() { var x = 'sfa' } console.log(x) // x is not defined 全局作用域和函数作用域 全局作用域:在JavaScript...块级作用域 ES6新增的块级作用域:用let和const声明的变量才存在块级作用域,在该代码块外部访问不到该变量。在{ }中用let和const声明的变量就是一个块级作用域。...{ let a = 1; console.log(a) // 1 } console.log(a) // a is not defined 外部访问不到 二、作用域链 作用域链指的是各个作用域的嵌套关系和查找机制...上下文中的代码在执行的时候会创建变量对象的一个作用域链(scope chain)。 希望本篇文章能够帮助到大家!

    52500

    java作用域-什么是JavaScript作用域、作用域链?

    作用域、作用域链也是面试中出镜率很高的问题之一java作用域java作用域,同时也是中最重要的基础概念之一。   ...今天我们将通过最简单实际的代码来展示函数作用域和全局作用域,在下篇文章中,我们将介绍块级作用域和暂时性死区。   ...作用域基本知识   简单来说,作用域就是用来规定变量的作用范围的,在任何语言当中都会有作用域的概念,在ES6以前,只有函数作用域和全局作用域,ES6之后又增加块级作用域。   ...foo函数中也无法访问bar函数中定义的变量b,其作用域链中(直到最上层的全局作用域中)也并不存在变量b,所以代码会报错 : b is not   简单来说就是,在执行某个函数时,如果需要取某个变量的值...变量作用域就是这样一层一层相套的关系,逐层寻找,这也就是被称之作用域链的原因。   在下篇文章中,我们将介绍块级作用域和暂时性死区的相关内容。 本文共 678 个字数,平均阅读时长 ≈ 2分钟

    2.3K20

    JavaScript中的作用域和作用域链

    ES6 之前 JavaScript 没有块级作用域,只有全局作用域和函数作用域。ES6 的到来,为我们提供了‘块级作用域’,可通过新增命令 let 和 const 来体现。 2....作用域链 1.自由变量 首先认识一下什么叫做 自由变量 。如下代码中,console.log(a)要得到 a 变量,但是在当前的作用域中没有定义 a(可对比一下 b)。...作用域链 如果父级也没呢?再一层一层向上寻找,直到找到全局作用域还是没找到,就宣布放弃。这种一层一层的关系,就是 作用域链 。...function F1() { var b = 200 function F2() { var c = 300 console.log(a) // 自由变量,顺作用域链向父作用域找...console.log(b) // 自由变量,顺作用域链向父作用域找 console.log(c) // 本作用域的变量 } F2() } F1() 3

    2.7K10

    java作用域-javaScript预编译、作用域,作用域链详解

    ES5中只分为全局作用域和函数作用域java作用域,也就是说for,if,while等语句是不会创建作用域的。ES6(let,const)除外。   ...[[scope]]指的就是我们所说的作用域,其中存储了前面说的执行期上下文的集合,这个属性是在函数被定义的时候就创建   作用域链:[[scope]]中所存储的执行期上下文对象的集合,这个集合呈链式链接...,我们把这种链式链接叫做作用域链。   ...寻找变量的过程就是从变量作用域链开始查找的,如果在当前的变量作用域没找到,那么就去上一个变量作用域里面去早   作用域链创建的过程:   预编译   先来理解一下预编译,看例子:   ...需要注意的时候,函数存储被定义时的上下文的时候java作用域,只是存储的是一个引用,而不是副本,正是因为这样,才能形成作用域链,当函数在本函数的AO对象找不到的时候,就沿着本函数的[[scope]]存储的上一个作用域的变量对象的引用到上一个作用域里面去早

    1.7K40

    JavaScript复习之作用域链

    都是涉及到了今天要复习的知识点, 也就是JavaScript中存在着基于作用域而产生的一条类似链表的链路。 和之前的做法一样, 在对于一个知识点复习前最好先看看自己脑海中对它还留有多少印象和概念。...这个银行和它制定的规则,就是作用域对于变量的作用。 2. 词法作用域与动态作用域 在JavaScript中,所使用的作用域是词法作用域,也称为静态作用域。它是在编译前就确定的。...这就是静态作用域,只需要看变量和函数的书写位置,即可确定它们都作用域范围。 与之相对的是动态作用域, 在JavaScript中涉及到动态作用域的只有this指向,这在之后复习this时会涉及。...作用域链 通过上文阐述的各个知识点,作用域链就很好理解了,在ES3中就是执行上下文里其变量对象VO + 自身父作用域,然后每个执行上下文依次串联出一条链路所形成的就是作用域链。...外部环境引用依次串联也会形成一条链路,也属于作用域链。 它的作用在于变量的查找路径。当代码执行时,遇到一个变量就会通过作用域链不断回溯,直到找到该值又或者是到了全局作用域这顶层还是不存在,则会报错。

    12310

    【JavaScript】执行上下文与作用域、作用域链

    执行上下文是一个包含执行时所需信息的数据结构,包括变量对象、作用域链、this指针等。 在V8引擎中,执行上下文是由JavaScript引擎的内部组件——解释器和编译器共同创建的。...作用域链 上下文中的代码在执行的时候,会创建上下文对象的一个作用域链。这个作用域链决定了各级上下文中代码在访问变量和函数时的顺序。...作用域 上下文其实就是我们最熟悉的作用域。上下文之间的连接是线性的、有序的。内部上下文可以通过作用域链访问外部上下文的一切,但外部作用域无法访问到内部作用域的任何东西。...作用域链增强 所谓作用域链增强说就是通过一些语句在作用域链前端临时添加一个上下文,这个上下文会在执行后被删除,代码执行到以下任意一种情况都会出现这个现象: try/catch中的catch块 with语句...如果在局部上下文中找到该标识符,则搜索停止,变量确定;如果没有找到变量名,则继续沿作用域链搜索(注意:作用域链中的对象也有一个原型链,因此搜索可能会涉及每个对象的原型链,至于原型链后续会出一篇文章来讲解

    79820

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

    JavaScript 中的作用域与作用域链对于开发者来说至关重要,它们是理解和使用 JavaScript 的基础,例如代码模块化与封装,作用域允许开发者将变量和函数限制在特定的范围内,这有助于代码的模块化...另外也要理解作用域链与闭包,理解作用域链是掌握闭包概念的关键,闭包允许函数访问并操作其词法作用域之外的变量,这对于创建数据封装和私有变量非常有用。...在 JavaScript 中,函数创建了一个新的作用域。...当在函数内部访问一个变量时,JavaScript 引擎会首先在函数的局部作用域中查找,如果找不到,则会沿着作用域链向上查找,直到全局作用域。...理解 JavaScript 的作用域和作用域链对于编写高效、可维护的代码至关重要。通过掌握这些概念,开发者可以更好地控制变量的访问范围,并利用闭包来创建更灵活的函数。

    34720

    java作用域-翻译:⚡⛓️可视化的 JavaScript作用域(链)

    是时候讨论作用域链(Scope Chain)了。在此之前,我假设你已经知道了一些执行上下文( )的基础知识。   ...每个上下文都有一个作用域链(Scope Chain)。   ...对于 函数而言,作用域链(Scope Chain)看起来像这样(别担心看不懂,现在还不需要完全理解):   作用域链(Scope Chain)基本上就是对象之间的“引用链”,包括了该执行上下文( )中可引用的值和对其他作用域的引用...为了找到 city 的值, 引擎会“沿着作用域链往下走”。这基本上意味着 引擎不会轻易地放弃:它会尽力查找,看看能否在本地作用域所引用的外部作用域中找到变量 city 的值。...我们可以沿着作用域链往下走java作用域,但是不能沿着作用域链往上走。(好吧,这可能会引起混乱,有些人会反过来理解“上”和“下”的意思。

    58420

    前端入门18-JavaScript进阶之作用域链声明正文-作用域链

    正文-作用域链 作用域一节中,我们介绍了变量的作用域分两种:全局和函数内,且函数内部可以访问外部函数和全局的变量。...理论 作用域链的原理还是跟执行上下文 EC 有关,执行上下文 EC 有个作用域链属性(Scope chain),作用域链是个链表结构,链表中每个节点是一个 VO,在函数内部嵌套定义新函数就会多产生一个节点...两个步骤创建了当前函数的作用域链,而当函数体的代码操作变量时,优先到作用域链的表头指向的 VO 寻找,找不到时,才到作用域链的每个节点的 VO 中寻找。...所以,函数的内部属性 [[Scope]] 存储着外层函数的作用域链,那么当每次调用函数时,创建函数执行上下文的作用域链属性时,直接拼接外层函数的作用域链和当前函数的 VO,就可以达到以函数内部变量优先,...总之,JavaScript 中的变量之所以可以在定义后被使用,是因为定义的这些变量都被添加到当前执行上下文 EC 的变量对象 VO 中了,而之所以有全局和函数内两种作用域,是因为当前执行上下文 EC 的作用域链属性的支持

    47930

    作用域与作用域链

    作用域与作用域链 通常来说,一段程序代码中所用到的名字并不总是有效或可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域scope。...如果一个变量或者其他表达式不在当前的作用域,则将无法使用。作用域也可以根据代码层次分层,以便子作用域可以访问父作用域,通常是指沿着链式的作用域链查找,而不能从父作用域引用子作用域中的变量和引用。...作用域 JavaScript作用域为静态作用域static scope,也可以称为词法作用域lexical scope,其主要特征在于,函数作用域中遇到既不是参数也不是函数内部定义的局部变量时,去函数定义时上下文中查...全局作用域 直接声明在顶层的变量或方法就运行在全局作用域,借用函数的[[Scopes]]属性来查看作用域,[[Scopes]]是保存函数作用域链的对象,是函数的内部属性无法直接访问但是可以打印来查看。...作用域、localContext作用域、Global作用域,总结来说,当需要使用函数或者变量时,如果在当前作用域中没有查到值,就会向上级作用域去查,直到查到全局作用域,这样一个查找过程形成的链条就叫做作用域链

    2.3K20

    JavaScript——执行环境、变量对象、作用域链

    前言 这几天在看《javascript高级程序设计》,看到执行环境和作用域链的时候,就有些模糊了。书中还是讲的不够具体。通过上网查资料,特来总结,以备回顾和修正。...作用域链 在执行上下文的作用域中查找变量的过程被称为标识符解析(indentifier resolution),这个过程的实现依赖于函数内部另一个同执行上下文相关联的对象——作用域链。...作用域链是一个有序链表,其包含着用以告诉JavaScript解析器一个标识符到底关联着那一个变量的对象。而每一个执行上下文都有其自己的作用域链Scope。...一句话:作用域链Scope其实就是对执行上下文EC中的变量对象VO|AO有序访问的链表。能按顺序访问到VO|AO,就能访问到其中存放的变量和函数的定义。...即: Scope = [AO].concat([[Scope]]); 这说明了,作用域链是在函数创建时就已经有了。 那么[[Scope]]是什么呢?

    88310

    【JavaScript】作用域 ① ( JavaScript 作用域 | 全局作用域 | 局部作用域 | JavaScript 变量 | 全局变量 | 局部变量 )

    一、JavaScript 作用域 1、作用域概念 在 JavaScript 代码中 , 使用的 变量 / 函数 等 名称 在 声明后 , 并不是 在所有的位置 都有效的 , 限定 上述 变量 / 函数...可维护性 , 避免 命名冲突 , 在不同的作用域中 , 可以使用相同的名称 ; 2、全局作用域 和 局部作用域 JavaScript 的 作用域 分为 全局作用域 和 局部作用域 两种类型 : 全局作用域... // JavaScript 作用域 // 1....中 , 相同名称 的变量 本作用域的 变量 优先级较高 ; 二、JavaScript 变量 1、全局变量 和 局部变量 JavaScript 变量 根据 其 被声明的 作用域类型 , 分为 全局变量... // JavaScript 作用域 // 1.

    45110

    JS作用域和作用域链

    全局变量的作用域是全局性的,即在JavaScript代码中,该全局变量处处都有定义。...下面就要借助JS的作用域链来更好的理解作用域了。 在此之前,先要明确个概念,即执行环境和作用域是两个完全不同的概念。 函数的每次调用都有与之紧密相关的作用域和执行环境。...当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain)。作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问。...作用域链包含了执行环境栈中的每个执行环境对应的变量对象。通过作用域链,可以决定变量的访问和标识符的解析。 注意:全局执行环境的变量对象始终都是作用域链的最后一个对象。...需要注意的是:内部环境可以通过作用域链访问所有的外部环境,但是外部环境不能访问内部环境中的任何变量和函数。 标识符解析(变量名或函数名搜索)是沿着作用域链一级一级地搜索标识符的过程。

    4.8K30

    作用域、执行环境、作用域链

    作用域,之前有介绍过,JavaScript无块级作用域,只有函数作用域,简单点说就是JavaScript的作用域就是函数作用域。因为有函数作用域,所以我们有全局作用域和局部作用域的说法。...当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。...当fun1执行的时候创建了一个作用域链,所以fun1有两个变量对象,一个是自己,一个是全局环境的变量对象window。fun1可以在函数内部访问变量a,因为fun1所在的作用域链可以找到变量a。...,作用域链中的内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数。...作用域链中,每一个局部环境都会首先寻找自身环境中的属性和方法,搜索到了就停止寻找,没有找到再向上搜索直到最外层window还搜索不到就报错。 (完)

    1.8K30

    JavaScript-作用域、块级作用域、上下文、执行上下文、作用域链

    一、作用域 在 JavaScript 中, 作用域(scope,或译有效范围)就是变量和函数的可访问范围,即作用域控制着变量和函数的可见性和生命周期 二、全局/局部作用域 2.1 全局作用域(Global...2.2 局部作用域(Local Scope) (1)JavaScript的作用域是通过函数来定义的,在一个函数中定义的变量只对这个函数内部可见,称为函数(局部)作用域。...十、作用域链 (1)在JavaScript中,函数也是对象,对象中有些属性我们可以访问,但有些不可以(访问),这些属性仅供JavaScript引擎存取,[[scope]]就是其中一个。...10.2 攀爬作用域链 (1)当不同执行上下文之间存在 变量命名冲突,可以通过攀爬作用域链解决(从顶部到底部)。...如果在自己的变量对象中没发现要查找的变量,继续搜索作用域链。他将攀爬作用域链检查每一个执行上下文的变量对象,去寻找和变量名称匹配的值。

    3.9K22
    领券