JavaScript之作用域链详解

news/2024/6/18 22:00:57 标签: javascript

在JavaScript中,作用域链是一个重要的概念,它决定了变量和函数的可访问性。作用域链是由变量对象的列表组成,这些变量对象按照它们被创建的顺序排列。本文将详细介绍JavaScript作用域链,包括什么是作用域链、作用域链的创建过程、作用域链的查找规则以及相关的代码示例。

1. 作用域链的定义

作用域链是JavaScript中一个执行上下文(Execution Context)中所有可访问变量和函数的列表。在查找变量或函数时,JavaScript引擎会按照作用域链的顺序逐级查找。

2. 作用域链的创建过程

当进入一个新的执行上下文时,会按照以下步骤创建作用域链:

  1. 创建变量对象(VO):根据上下文的类型创建一个空的变量对象。
  2. 建立作用域链:作用域链的顶端是当前执行上下文的变量对象,然后依次链接到父级执行上下文的变量对象,直至全局执行上下文。
  3. 初始化变量对象:将函数的参数、函数声明和变量添加到变量对象中。
var globalVar = "I am global";

function outer({
  var outerVar = "I am outer";

  function inner({
    var innerVar = "I am inner";
    console.log(globalVar, outerVar, innerVar);
  }

  inner();
}

outer();

在上述例子中,执行 outer 函数时,会创建作用域链,其中包括全局变量、outer 函数变量,以及 inner 函数变量。

3. 作用域链的查找规则

在查找变量或函数时,JavaScript引擎会按照以下规则在作用域链上逐级查找:

  1. 从当前执行上下文的变量对象开始查找
  2. 如果找到,则返回该变量的值
  3. 如果未找到,则继续沿着作用域链向上查找,直到全局执行上下文。
  4. **如果全局执行上下文都没有找到,则返回 undefined**。
var globalVar = "I am global";

function outer({
  var outerVar = "I am outer";

  function inner({
    var innerVar = "I am inner";
    console.log(globalVar, outerVar, innerVar);
  }

  inner();
}

outer();

在上述例子中,inner 函数可以访问全局变量 globalVar 和外部函数变量 outerVar,这是因为它们都在 inner 函数的作用域链上。

4. 闭包与作用域链

闭包是指在一个函数内部定义的函数,它可以访问外部函数的变量,形成一个闭包作用域链。

function outer({
  var outerVar = "I am outer";

  function inner({
    var innerVar = "I am inner";
    console.log(outerVar, innerVar);
  }

  return inner;
}

var closure = outer();
closure(); // 输出:I am outer I am inner

在上述例子中,inner 函数被返回并赋值给变量 closure,形成了一个闭包。当调用 closure 时,它仍然可以访问外部函数 outer 的变量,因为闭包保留了外部函数的作用域链。

结论

作用域链是JavaScript中控制变量和函数可访问性的关键机制。通过深入了解作用域链的创建过程和查找规则,我们能更好地理解JavaScript代码的执行过程,尤其是在涉及嵌套函数和闭包的情况下。

本文由 mdnice 多平台发布


http://www.niftyadmin.cn/n/5476535.html

相关文章

文旅元宇宙|“元宇宙+”全面赋能智慧文旅场景建设

元宇宙作为下一代互联网入口,正在潜移默化的改变着人生的生活方式,不断催生新业态,带给人们前所未有的体验。元宇宙概念的崛起,正以其独特的魅力,引领着一场全新的智慧文旅革命。元宇宙,这个融合了虚拟现实…

LinkedHashMap 集合源码分析

LinkedHashMap 集合源码分析 文章目录 LinkedHashMap 集合源码分析一、字段分析二、内部类分析三、构造方法分析四、内部方法分析五、总结 LinkedHashMap 是 HashMap 的子类,在 HashMap 的基础上维护了双向链表,保证了有序性。默认是不排序的&#xff0c…

如何恢复被.locked勒索病毒加密的服务器和数据库?

.locked勒索病毒有什么特点? .locked勒索病毒的特点主要包括以下几个方面: 文件加密:.locked勒索病毒会对受感染设备上的所有文件进行加密,包括图片、文档、视频和其他各种类型的重要文件。一旦文件被加密,文件的扩展…

每天学习python30分钟(第三天)

一.面向对象 了解oop for i in range(1,5):for j in range(1,5):for k in range(1,5):if((i!j) and (i!k) and (j!k)):print(i,j,k) 二.类 基础的类使用 class CuteCat: #通过calss创建可爱猫猫类def __init__(self,cat_name,cat_age,cat_color): #定义属性s…

前端学习<二>CSS基础——16-浏览器的兼容性问题

我们在div里放一个img&#xff0c;发现&#xff1a; 在html和html5中&#xff0c;div的长宽是不同的&#xff0c;后者的高度要超过几个像素。 比如说&#xff0c;下面这个是html的。 <!DOCTYPE html><html lang"en"><head><meta charset"…

2024-04-07 作业

作业要求&#xff1a; 1> 思维导图 2> 自由发挥应用场景实现一个登录窗口界面。 【可以是QQ登录界面、也可以是自己发挥的登录界面】 要求&#xff1a;尽量每行代码都有注释 作业1&#xff1a; 作业2&#xff1a; 运行代码&#xff1a; #include "myqwidget.h&quo…

揭秘程序员面试技巧,助你轻松拿offer!

上文 程序员面试是求职者展现自身技术实力、沟通能力和职业素养的关键环节。为了在面试中脱颖而出&#xff0c;求职者需要掌握一些实用的面试技巧。以下将详细阐述程序员面试技巧&#xff0c;助您在面试中取得更好的成绩。 一、面试前准备 了解公司及职位 在面试前&#xff0…

ngnix的反向代理是什么?有什么作用?

1、Nginx的反向代理是什么&#xff1f; Nginx的反向代理是一种网络架构模式&#xff0c;其中Nginx服务器作为前端服务器&#xff0c;接收客户端的请求&#xff0c;然后将这些请求转发给后端服务器&#xff08;例如Java应用程序服务器&#xff09;。在这个过程中&#xff0c;客…