我是靠谱客的博主 积极万宝路,最近开发中收集的这篇文章主要介绍深入理解作用域和作用域链,揭露本质,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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

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

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

  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 位...指向的变量对象(如果存在的话)中查找,直至全局变量对象,如果全局变量对象中也没有的话,就会抛出错误。

最后

以上就是积极万宝路为你收集整理的深入理解作用域和作用域链,揭露本质的全部内容,希望文章能够帮你解决深入理解作用域和作用域链,揭露本质所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(78)

评论列表共有 0 条评论

立即
投稿
返回
顶部