概述
最近看了一些相关的文章,但总感觉讲的太过浮于表面,总是从现象解释,没有讲更深层的东西,看了之后,还是感觉云里雾里。所以最近也是研究了一下,希望对你有所帮助。
在讲本篇的正文前,大家先看看这篇博客,理解执行上下文和变量对象的概念。
直接抛出结论:作用域链的本质是一个包含指针的列表,指针指向变量对象(也就是作用域)。
作用域链和变量对象都存在于执行上下文之中,执行上下文可以理解成代码的执行环境,其可以分为三种类型:
- 全局执行上下文
- 函数执行上下文
- eval执行上下文
在这里以函数执行上下文为例,当我们调用函数,函数代码真正执行之前,会进行函数执行上下文的创建工作,执行上下文的创建有三步:
- 创建变量对象(包含 arguments 对象,参数,内部的变量和函数声明)
- 初始化作用域链
- 确定 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 位...指向的变量对象(如果存在的话)中查找,直至全局变量对象,如果全局变量对象中也没有的话,就会抛出错误。
最后
以上就是积极万宝路为你收集整理的深入理解作用域和作用域链,揭露本质的全部内容,希望文章能够帮你解决深入理解作用域和作用域链,揭露本质所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复