深入理解作用域和作用域链,揭露本质

本文详细探讨了作用域链的本质——一个包含指针的列表,以及它在执行上下文中(全局、函数、eval)的工作原理。通过函数执行上下文实例,展示了作用域链如何链式查找变量,从局部到全局的过程。理解这些概念有助于解开代码执行的神秘面纱。
摘要由CSDN通过智能技术生成

最近看了一些相关的文章,但总感觉讲的太过浮于表面,总是从现象解释,没有讲更深层的东西,看了之后,还是感觉云里雾里。所以最近也是研究了一下,希望对你有所帮助。

在讲本篇的正文前,大家先看看这篇博客,理解执行上下文和变量对象的概念。

直接抛出结论:作用域链的本质是一个包含指针的列表,指针指向变量对象(也就是作用域)。

作用域链和变量对象都存在于执行上下文之中,执行上下文可以理解成代码的执行环境,其可以分为三种类型:

  1. 全局执行上下文
  2. 函数执行上下文
  3. eval执行上下文

在这里以函数执行上下文为例,当我们调用函数,函数代码真正执行之前,会进行函数执行上下文的创建工作,执行上下文的创建有三步:

  1. 创建变量对象(包含 arguments 对象,参数,内部的变量和函数声明)
  2. 初始化作用域链
  3. 确定 this 的执行

接下来以一段代码为例,图像化的理解作用域和作用域链。

let baseNum = 10

function add(num1, num2) {
  return baseNum + num1 + num2
}

let result = add(4, 5)
console.log(result)

当执行 add() 函数的时候,add() 函数的执行上下文如下所示:

 add()函数的执行上下文内有作用域链,其是一个包含指针的列表,列表第 0 位的指针指向 add() 函数的变量对象(add() 函数的作用域),列表的第 1 位的指针指向全局的变量对象(全局作用域)。

add() 函数执行时,需要 baseNum、num1 和 num2 变量,查找流程是首先从作用域链第 0 位指向的变量对象(作用域)中查找,在这里可以找到 num1 和 num2,但是 baseNum 找不到,所以接下来会向作用域链第 1 位指向的变量对象(作用域)中查找,在全局变量对象中可以找到 baseNum。

作用域链提供了一种链式的查找机制,首先在作用域链第 0 位指向的变量对象中查找,如果没有找到的话,会依次向作用域链中第 1 位、第 2 位、第 3 位...指向的变量对象(如果存在的话)中查找,直至全局变量对象,如果全局变量对象中也没有的话,就会抛出错误。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值