图解JavaScript作用域链底层原理

下面就为大家讲解一下“图解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日

相关文章

  • JS与C#编码解码

    JS和C#都内置了编码和解码的功能,并提供了多种编码和解码方式。下面我将具体讲解JS和C#中的编码和解码,并提供两个示例来演示编码和解码的过程。 JS中的编码和解码 在JS中,我们通常使用encodeURI和encodeURIComponent来对URL进行编码,使用decodeURI和decodeURIComponent对URL进行解码。下面是具体的使用方…

    JavaScript 2023年5月20日
    00
  • Express框架req res对象使用详解

    下面是关于“Express框架req res对象使用详解”的完整攻略。 1. HTTP请求(req)对象 Express框架提供了一个request对象(通常缩写为 req),作为每个请求的入口点,它包含了HTTP请求的属性和方法。 1.1 请求路径 req.path属性可用于获取请求的路径,例如: app.get(‘/users/:id’, functio…

    JavaScript 2023年6月11日
    00
  • JavaScript箭头函数的五种使用方法及三点注意事项

    下面我就详细讲解一下“JavaScript箭头函数的五种使用方法及三点注意事项”的攻略。 JavaScript箭头函数的五种使用方法 1. 简单的箭头函数 简单的箭头函数是指只有一个参数且只有一条语句的箭头函数。例如,以下代码: const greeting = name => `Hello, ${name}!`; console.log(greeti…

    JavaScript 2023年5月27日
    00
  • 用js实现每隔一秒刷新时间的实例(含年月日时分秒)

    下面是用js实现每隔一秒刷新时间的攻略,包含两个示例说明: 1. 调用setInterval函数实现每隔一秒钟刷新时间 setInterval是一个内置函数,用于重复执行某个任务。我们可以利用setInterval函数实现每隔一定时间刷新时间。 具体实现方法如下: function refreshTime() { var now = new Date(); …

    JavaScript 2023年5月27日
    00
  • input禁止键盘及中文输入,但可以点击

    要实现input禁止键盘及中文输入,但可以点击的效果,需要使用HTML标签和JavaScript语言。下面是具体的实现步骤: HTML标签部分 在HTML标签中,需要给input标签添加readonly和onfocus两个属性。readonly属性可以让input禁止键盘输入,onfocus属性可以在输入框被点击时触发相应的JavaScript函数。具体代码…

    JavaScript 2023年6月11日
    00
  • JavaScript事件处理的方式(三种)

    JavaScript事件处理的方式,一般可以分为三种,分别是通过HTML属性、DOM 0级事件处理和DOM 2级事件处理。下面将一一详细讲解。 1. HTML属性方式 使用HTML标签的事件属性来绑定事件,比如<button onclick=”alert(‘clicked’)”>Click me</button>。 HTML属性事件处…

    JavaScript 2023年5月17日
    00
  • JavaScript数组reduce()方法

    我们来详细讲解一下JavaScript数组reduce()方法的完整攻略。 简介 reduce() 方法是JavaScript数组的一个非常强大的方法,它可以将一个数组中的所有元素依次执行一个回调函数,并将最终结果返回。在实际应用中,这个方法非常多样化,能够应用于各种情景。 基本语法 reduce() 方法的基本语法如下: array.reduce(func…

    JavaScript 2023年5月18日
    00
  • js实现精确到秒的倒计时效果

    实现精确到秒的倒计时效果,需要以下几个步骤: 1. 获取时间戳 首先,我们需要获取当前时间的时间戳(单位为毫秒),可以使用JavaScript内置的Date.now()方法获取到当前的时间戳,例如: const now = Date.now(); 2. 计算倒计时时间 接下来,需要通过时间戳计算出倒计时结束的时间。假如需要倒计时10秒钟,可以使用如下代码计算…

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