js作用域及作用域链概念理解及使用

yizhihongxing

JS作用域及作用域链概念理解及使用攻略

1. 作用域的概念

在JavaScript中,作用域是指变量、函数和对象的可访问范围。作用域规定了在代码中的哪些部分可以访问变量、函数和对象。理解作用域对于编写可维护和可扩展的代码非常重要。

JavaScript中有三种作用域:
- 全局作用域:在整个程序中都可以访问的变量和函数。
- 函数作用域:在函数内部定义的变量和函数,只能在函数内部访问。
- 块级作用域:在ES6中引入的概念,使用letconst声明的变量具有块级作用域,只能在声明的块内部访问。

2. 作用域链的概念

作用域链是指在JavaScript中,每个作用域都有一个关联的变量对象列表。当访问一个变量时,JavaScript引擎会按照作用域链的顺序从内到外查找变量,直到找到该变量或者到达全局作用域。

作用域链的构建过程:
1. 在函数创建时,会创建一个称为“变量对象”的特殊对象,用于存储函数内部的变量和函数声明。
2. 在函数执行时,会创建一个称为“活动对象”的对象,用于存储函数执行过程中的变量和函数。
3. 当访问一个变量时,JavaScript引擎首先在当前作用域的活动对象中查找,如果找不到,则沿着作用域链向上查找,直到找到该变量或者到达全局作用域。

3. 示例说明

示例1:全局作用域和函数作用域

var globalVariable = 'Global'; // 全局变量

function foo() {
  var localVariable = 'Local'; // 函数内部变量
  console.log(localVariable); // 输出:Local
  console.log(globalVariable); // 输出:Global
}

foo();
console.log(globalVariable); // 输出:Global
console.log(localVariable); // 报错:localVariable未定义

在上面的示例中,globalVariable是一个全局变量,可以在整个程序中访问。localVariable是在函数foo内部定义的变量,只能在函数内部访问。在函数内部,可以访问函数内部的变量和全局变量。在函数外部,只能访问全局变量。

示例2:作用域链的查找顺序

var globalVariable = 'Global';

function outer() {
  var outerVariable = 'Outer';

  function inner() {
    var innerVariable = 'Inner';
    console.log(innerVariable); // 输出:Inner
    console.log(outerVariable); // 输出:Outer
    console.log(globalVariable); // 输出:Global
  }

  inner();
}

outer();
console.log(globalVariable); // 输出:Global
console.log(outerVariable); // 报错:outerVariable未定义
console.log(innerVariable); // 报错:innerVariable未定义

在上面的示例中,inner函数内部可以访问到innerVariableouterVariableglobalVariable。在inner函数内部,首先在自己的活动对象中查找变量,找到了innerVariable。如果没有找到,就会沿着作用域链向上查找,找到了outerVariableglobalVariable。在outer函数外部,无法访问outerVariableinnerVariable,因为它们只在函数内部可见。

以上是关于JS作用域及作用域链概念的详细攻略,希望对你有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js作用域及作用域链概念理解及使用 - Python技术站

(0)
上一篇 2023年8月19日
下一篇 2023年8月19日

相关文章

  • SpringBoot读取配置文件常用方法解析

    SpringBoot读取配置文件常用方法解析 在SpringBoot应用中,读取配置文件是十分常见的操作,SpringBoot为读取配置文件提供了多种方式,下面对这些方法进行详细解析。 1. 使用@Value注解 @Value注解是Spring框架中常用的用于获取配置文件中属性值的注解,也可以用于将自定义配置属性值注入到Spring管理的Bean中。使用方法…

    other 2023年6月25日
    00
  • linux-docker:使用–net=host隐藏端口

    以下是关于“linux-docker:使用–net=host隐藏端口”的完整攻略,包括定义、方法、示例说明和注意事项。 定义 Docker是一种量级的虚拟化技术,可以将应用程序和其依赖项打包到一个容器中,以便在不同的环境中运。在Docker中,可以使用–net=host参数来隐藏容器中的端口,使得容器中的应用程序可以直接使用主机的网络接口。 方法 以下是…

    other 2023年5月8日
    00
  • web可视化开发工具 App Builder 2019安装注册激活教程(含下载)

    Web可视化开发工具App Builder 2019安装注册激活教程 下载App Builder 2019 首先,我们需要下载App Builder 2019的安装包。可以在App Builder官方网站下载:https://www.davidesperalta.com/appbuilder 安装App Builder 2019 双击刚才下载好的安装包,进入…

    other 2023年6月27日
    00
  • Android开发教程之ContentProvider数据存储

    ContentProvider是Android中非常重要的一个系统组件,常用于实现应用程序间的数据共享。同时,也可以在应用内部使用ContentProvider实现数据的存储、查询和修改。本文将从以下几个方面入手讲解ContentProvider的使用及数据存储方法: ContentProvider的概念及使用方法 使用ContentProvider进行数据…

    other 2023年6月27日
    00
  • 详解Angular组件之生命周期(二)

    《详解Angular组件之生命周期(二)》是一篇介绍Angular组件生命周期的文章,包含了组件生命周期的各个阶段及其对应的钩子函数,以及各个阶段的具体实现代码等内容。 首先,文章介绍了Angular组件生命周期的主要阶段,包括: ngOnChanges:监听组件输入属性的变化并进行相应处理,包括@Input装饰器绑定的变量的变化。 ngOnInit:在组件…

    other 2023年6月27日
    00
  • 基于jquery的简单富文本编辑器

    基于jQuery的简单富文本编辑器 随着Web应用程序的发展,越来越多的用户希望能够在网页中直接进行富文本编辑。市面上有许多优秀的开源富文本编辑器,其中使用最广泛的是基于JavaScript的开源富文本编辑器。在这里,我们将介绍一个基于jQuery的简单富文本编辑器。 使用jQuery构建富文本编辑器 jQuery是一个功能强大、使用方便、兼容性良好的Jav…

    其他 2023年3月28日
    00
  • C/C++举例讲解关键字的用法

    C/C++关键字的用法详解 C/C++是一种广泛使用的编程语言,其中关键字是语言的基本构建块。在本攻略中,我们将详细讲解C/C++中一些常用关键字的用法,并提供示例说明。 1. if-else语句 if-else语句用于根据条件执行不同的代码块。它的语法如下: if (condition) { // 如果条件为真,执行这里的代码 } else { // 如果…

    other 2023年7月29日
    00
  • Android实现登录注册功能

    Android实现登录注册功能攻略 1. 创建用户界面 首先,我们需要创建用户界面来实现登录和注册功能。可以使用XML布局文件来定义界面元素,例如EditText、Button等。以下是一个示例: <LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\…

    other 2023年9月6日
    00
合作推广
合作推广
分享本页
返回顶部