图解JavaScript作用域链底层原理

yizhihongxing

下面就为大家讲解一下“图解JavaScript作用域链底层原理”的完整攻略。

什么是作用域链?

作用域链指的是在 JavaScript 中,用于查找变量的一种机制。在 JavaScript 中,每个函数都有一个作用域链,它是由多个执行上下文(Execution Context)(如全局上下文、函数上下文等)的变量环境引用组成的链式结构。在查找变量时,JavaScript 引擎会从当前执行上下文的变量环境开始,依次沿着作用域链向上查找,直到找到所需的变量或到达全局上下文为止。

作用域链的底层原理

作用域链是由多个执行上下文的变量环境引用组成的链式结构,其中每个执行上下文分别有以下几个组成部分:

  1. 变量对象(Variable Object):保存该执行上下文中定义的变量和函数声明,以便在后续的代码中进行查找。

  2. 作用域链(Scope Chain):由指向父级执行上下文的引用组成,该引用指向着它创建时的活动对象(Active Object)。

  3. this 值的引用(This Value):保存 this 关键字的引用,指向该执行上下文所处的对象。

当 JavaScript 引擎需要查找一个变量时,它会先在当前执行上下文的变量对象中查找,如果找到,则返回该变量的值;否则,它会沿着作用域链向上查找,直到找到该变量或到达全局上下文为止。

示例说明一:变量作用域的例子

var a = 1;
function outer() {
  var b = 2;
  function inner() {
    var c = 3;
    console.log(a + b + c); // 打印 6
  }
  inner();
}
outer();

在上面的代码中,变量 a 定义在全局作用域中,变量 b 和函数 inner 定义在函数 outer 内部。当执行 inner 函数时,它会先在自己的变量对象中查找变量 c,如果找到,则返回该变量的值;否则,它会沿着作用域链向上查找,先到外层函数 outer 的变量对象中查找变量 b,如果找到,则返回该变量的值;否则,它会再向上查找,最终到全局作用域中查找变量 a,如果找到,则返回该变量的值,打印出来的结果为 6。

示例说明二:修改变量作用域的例子

var a = 1;
function outer() {
  var a = 2;
  function inner() {
    a = 3;
    console.log(a); // 打印 3
  }
  inner();
  console.log(a); // 打印 2
}
outer();
console.log(a); // 打印 1

在上面的代码中,变量 a 同样定义在全局作用域中,变量 a 和函数 inner 同样定义在函数 outer 内部。当执行 inner 函数时,它会先在自己的变量对象中查找变量 a,如果找到,则返回该变量的值;否则,它会沿着作用域链向上查找,先到外层函数 outer 的变量对象中查找变量 a,找到后将其值修改为 3。在 inner 函数内部,打印出来的结果为 3。当 inner 函数执行完毕后,在 outer 函数内部,打印出来的结果为 2(因为修改的是 outer 函数内部的变量 a)。最后,在全局作用域中,打印出来的结果为 1。这就是作用域链的底层原理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:图解JavaScript作用域链底层原理 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 细说javascript函数从函数的构成开始

    细说JavaScript函数从函数的构成开始 JavaScript 函数是程序中的基础组件之一。在本文中,我们将深入了解 JavaScript 函数,包括函数的构成、参数传递和作为值的函数等。 函数的构成 JavaScript 函数由函数名称、参数列表、函数体和返回值组成。下面是一个最简单的 JavaScript 函数示例: function sayHell…

    JavaScript 2023年5月27日
    00
  • JavaScript下申明对象的几种方法小结

    现在为大家详细讲解“JavaScript下申明对象的几种方法小结”。 一、对象的概念 在JavaScript中,对象是一种复合的数据类型。对象可以包含多个属性(键值对),每个属性的值可以是基本类型数据、对象或函数等。对象常常用于描述真实世界中的事物,比如一本书、一个人或一辆汽车等等。 二、申明对象的几种方式 JavaScript中申明对象的方式有多种,下面会…

    JavaScript 2023年5月27日
    00
  • 魔鬼字典 JavaScript 笔记 代码比较多乱

    作为网站的作者,我很高兴为您讲解“魔鬼字典JavaScript笔记代码比较多乱”的攻略。下面,我将为您分别介绍该笔记的结构和示例代码的解读。 一、笔记结构 该笔记使用了Markdown格式编写,并通过代码块对示例代码进行了展示。具体来说,其结构如下: 标题 每篇笔记的顶部都有一个标题,用于概括该笔记的主题,方便读者快速理解。 前言 在笔记主体部分之前,通常会…

    JavaScript 2023年5月19日
    00
  • js学习笔记之class类、super和extends关键词

    JS学习笔记之Class类、super和extends关键词攻略 介绍 在ES6之前,JavaScript是一门纯粹的面向对象语言,而没有类的概念,而是采用基于原型的继承方式。在ES6之后,JavaScript引入了Class类、super和extends关键词,使得JavaScript的面向对象变得更加完善。Class语法让JavaScript的对象声明,…

    JavaScript 2023年6月10日
    00
  • 关于document.cookie的使用javascript

    下面我将为您详细讲解如何使用JavaScript中的document.cookie来操作cookie: 什么是cookie? Cookie是一种与特定网站相关联的小文本数据文件。在用户访问网站时,网站将Cookie存储在用户的计算机上,以便下次访问该站点时使用。它可以记录用户的各种信息,例如他们的用户名、购物车内容等。 使用document.cookie操作…

    JavaScript 2023年6月11日
    00
  • JS数组交集、并集、差集的示例代码

    下面我将介绍JS数组交集、并集、差集的示例代码,让大家有更深入的理解。 JS数组交集 数组交集指的是两个或两个以上数组中共同的元素。下面是一个示例代码: const arr1 = [1, 2, 3, 4, 5]; const arr2 = [3, 4, 5, 6, 7]; const arr3 = [4, 5, 6, 7, 8]; const interse…

    JavaScript 2023年5月27日
    00
  • 轻轻松松学习JavaScript

    轻轻松松学习JavaScript 一、前言 JavaScript是Web前端开发的核心技术之一,基本所有现代网站均使用JavaScript进行开发。因此,掌握JavaScript基础是学习Web前端开发的重要第一步。本篇攻略将介绍如何轻松入门学习JavaScript基础知识。 二、学习路线 1. 学习基础语法 学习JavaScript基础语法是入门的第一步。…

    JavaScript 2023年5月18日
    00
  • Javascript处理DOM元素事件实现代码

    当我们需要在网页中添加交互功能时,JavaScript 处理 DOM 元素事件是必须掌握的技能。在接下来的回答中,我将介绍完整的攻略,帮助你学会如何使用 JavaScript 处理 DOM 元素事件。 什么是事件? 在编写网页时,事件是指用户操作网页时所触发的动作。例如,当用户点击一个按钮,就会触发 click 事件;当用户将光标移动到一个元素上时,会触发 …

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部