关于JavaScript作用域你想知道的一切

关于JavaScript作用域你想知道的一切

什么是作用域?

在介绍作用域之前,我们先来看一下变量的定义。在JavaScript中,我们可以通过varletconst三个关键字来声明变量。

var a = 1; // 使用var声明的变量
let b = 2; // 使用let声明的变量
const c = 3; // 使用const声明的变量

那么,作用域是什么呢?

简单来说,作用域是指变量存在的环境,决定了变量的可见范围和生命周期。在JavaScript中,作用域分为全局作用域和局部作用域。

全局作用域和局部作用域

全局作用域指的是在函数外部声明的变量,它们的生命周期与页面的生命周期相同,直到页面关闭才会被销毁。

var a = 1; // 全局作用域
function test() {
  console.log(a); // 1
}
test(); // 输出 1

局部作用域指的是在函数内部声明的变量,它们的生命周期只存在于当前函数内部,在函数执行完毕后会被销毁。

function test() {
  var a = 1; // 局部作用域
  console.log(a); // 1
}
test(); // 输出 1
console.log(a); // 报错:ReferenceError: a is not defined

作用域链

当变量在当前作用域没有找到时,会沿着作用域链向上查找。作用域链的顶端是全局作用域,当全局作用域都没有找到时,会返回undefined

var a = 1;
function test() {
  console.log(a); // 在当前作用域找不到,向上查找,输出 1
}
test(); // 输出 1

块级作用域

在ES6之前,JavaScript中只有全局作用域和函数作用域。在函数内部使用var声明变量,它的作用域是整个函数,而不是函数内部的块级作用域。例如:

function test() {
  if (true) {
    var a = 1;
  }
  console.log(a); // 输出 1
}
test(); // 输出 1

在ES6中,新增了letconst关键字,它们声明的变量具有块级作用域,只能在当前块中访问。

function test() {
  if (true) {
    let a = 1;
    const b = 2;
  }
  console.log(a); // 报错:ReferenceError: a is not defined
  console.log(b); // 报错:ReferenceError: b is not defined
}
test();

示例一:闭包

闭包是函数和声明该函数的词法环境的组合。闭包包含了函数和其外部的作用域。通过闭包,我们可以访问外部函数中的变量,并且外部函数执行完后,变量不会被销毁。

function outer() {
  var a = 1;
  function inner() {
    console.log(a);
  }
  return inner;
}
var fn = outer();
fn(); // 输出 1

在这个例子中,inner函数可以访问outer函数中的a变量,因为outer函数的作用域被包含在inner函数的词法环境中,而且outer函数被执行完后,a变量并没有被销毁,因为它被inner函数的闭包所引用。

示例二:函数作为参数

在JavaScript中,函数也是一种数据类型,可以作为参数传递。

function add(x, y) {
  return x + y;
}
function handle(fn) {
  var x = 1;
  var y = 2;
  return fn(x, y);
}
console.log(handle(add)); // 输出 3

在这个例子中,函数add作为参数传递给了函数handle,并且在handle函数内部被执行。在执行add函数时,add函数的作用域被包含在handle函数的词法环境中,从而使得add函数能够访问handle函数内部的变量xy

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于JavaScript作用域你想知道的一切 - Python技术站

(0)
上一篇 2023年6月16日
下一篇 2023年6月16日

相关文章

  • Springcloud实现服务多版本控制的示例代码

    下面是针对“Springcloud实现服务多版本控制的示例代码”的完整攻略,包含两条示例说明: 什么是服务多版本控制 在微服务架构中,一个服务可能会有多个版本,每个版本可能会有一些差异,并且不同版本之间的兼容性也不尽相同。因此,在使用微服务架构进行开发时,如何对服务进行多版本控制就成为了必须要解决的问题。Spring Cloud提供了多种实现服务多版本控制的…

    Java 2023年5月23日
    00
  • Hibernate中5个核心接口知识点整理

    当我们使用Hibernate进行数据库操作时,会经常接触到如下5个核心接口: SessionFactory Session Transaction Query Criteria 它们分别是什么,有何作用?下面我们进行详细讲解。 SessionFactory SessionFactory是Hibernate的核心接口之一,通常也是Hibernate启动过程中的…

    Java 2023年5月19日
    00
  • JavaWeb分页的实现代码实例

    下面是一份JavaWeb分页的实现代码实例攻略。 1. 需求分析 在网站中,当数据量较大时,我们需要把它分页显示,从而提高用户体验。而JavaWeb框架中可以使用JSP来实现分页的功能。具体来说,我们需要针对以下几个步骤实现分页功能。 2. 分页实现步骤 2.1 准备工作 首先,我们需要创建一个数据表来存储数据,其次我们需要创建一个JavaBean来封装数据…

    Java 2023年6月15日
    00
  • Maven优雅的添加第三方Jar包的方法

    Sure!下面是详细的 “Maven优雅的添加第三方Jar包的方法” 博客攻略。 1. 引言 在 Java 开发过程中,需要依赖大量的第三方 Jar 包。Maven 作为一款优秀的项目构建工具,可以帮助我们管理 Jar 包依赖,提升开发效率。但是,由于某些原因,一些 Jar 包并没有上传到 Maven 中央仓库中,这时我们就需要手动导入 Jar 包,并将其打…

    Java 2023年5月20日
    00
  • Java中JavaBean对象和Map的互相转换方法实例

    JavaBean对象和Map之间的转换是Java中常见的操作。在处理数据时,我们可以将JavaBean转换为Map方便地获取属性值,也可以将Map转换为JavaBean以便于进行数据处理。接下来,我将为您提供一份JavaBean对象和Map的互相转换方法示例攻略。 JavaBean对象转换为Map 将JavaBean对象转换为Map可以使用Java中的反射技…

    Java 2023年5月26日
    00
  • Java使用jni清屏功能的实现(只针对cmd)

    下面是关于Java使用JNI清屏功能的实现攻略。 1. 概述 Java中使用JNI可以调用C代码,因此我们可以使用C代码实现一些Java无法直接实现的功能。本文将介绍如何使用JNI实现Java清屏功能(只针对cmd)。 2. 具体实现 2.1 JNI代码 我们需要编写C代码来实现清屏操作。以下是一个简单的C代码示例,可以实现Windows下的清屏操作: #i…

    Java 2023年5月26日
    00
  • 用java实现杨辉三角的示例代码

    下面是详细讲解使用Java实现杨辉三角的完整攻略。 1. 确定杨辉三角的数据生成方式 杨辉三角是一个数学概念,它的每个数字都是由上方两个数字相加而来。 首先,我们来确定杨辉三角的每个数字如何生成。以第4行为例: 1 1 1 1 2 1 1 3 3 1 我们从第1列开始,每到一个新的位置,它的值都等于上一行同列和前一列的值之和,如果上一行中的前/后一个数字不存…

    Java 2023年5月18日
    00
  • Struts2实现上传单个文件功能

    Struts2实现上传单个文件功能 1. 准备工作 在Struts2中实现文件上传功能,需要添加struts2-fileupload-plugin依赖包。可以在项目的pom.xml文件中加入以下代码: <dependency> <groupId>org.apache.struts</groupId> <artifac…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部