JavaScript作用域和闭包

news2024/11/18 21:58:31

JavaScript 中的 作用域(Scope)是指变量和函数在代码中可访问的范围。它决定了哪些变量和函数是可以访问的、哪些是不可访问的。理解作用域对于编写高效和没有错误的 JavaScript 代码至关重要。

JavaScript 中有两种主要的作用域类型:

1. 全局作用域 (Global Scope)

全局作用域是 JavaScript 中最外层的作用域。任何在全局作用域中声明的变量或函数,在整个程序中都可以访问。

let globalVar = "I am a global variable";

function testGlobalScope() {
  console.log(globalVar); // 访问全局变量
}

testGlobalScope(); // 输出 "I am a global variable"

在浏览器中,全局作用域通常是 window 对象。在 Node.js 中,全局作用域是 global 对象。

2. 函数作用域 (Function Scope)

每个函数都有自己的作用域。在函数内部声明的变量,只能在该函数内访问。如果在函数外部访问它,将会报错。

function myFunction() {
  let localVar = "I am a local variable";
  console.log(localVar); // 输出 "I am a local variable"
}

myFunction();
console.log(localVar); // 报错: ReferenceError: localVar is not defined

3. 块级作用域 (Block Scope)

块级作用域是通过 letconst 关键字引入的,它是作用于由花括号 {} 包裹的代码块(例如,if 语句、循环等)中的。块级作用域的变量在块外不可访问。

if (true) {
  let blockVar = "I am inside the block";
  console.log(blockVar); // 输出 "I am inside the block"
}

console.log(blockVar); // 报错: ReferenceError: blockVar is not defined

在传统的 JavaScript 中,只有函数作用域(由 var 声明的变量)和全局作用域是有效的。letconst 是 ES6 引入的,它们提供了块级作用域。

4. 词法作用域 (Lexical Scope)

JavaScript 是 词法作用域的语言,意味着变量的作用域是在代码编写时确定的,而不是运行时。即,嵌套函数可以访问其外部函数的变量,这种访问是基于它们在代码中的位置来决定的。

function outer() {
  let outerVar = "I am outside";

  function inner() {
    console.log(outerVar); // 访问 outer() 函数中的变量
  }

  inner();
}

outer(); // 输出 "I am outside"

5. 作用域链 (Scope Chain)

作用域链是 JavaScript 在查找变量时所遵循的规则。如果在当前作用域中找不到变量,JavaScript 会沿着作用域链向外层作用域查找,直到找到该变量或到达全局作用域。如果找不到,JavaScript 会抛出 ReferenceError

6. 闭包 (Closure)

闭包是指一个函数可以访问其外部作用域的变量,即使外部函数已经执行完毕。这种特性允许在函数执行后仍然保留对外部作用域变量的引用。

function outer() {
  let count = 0;
  
  return function inner() {
    count++;
    console.log(count);
  };
}

const counter = outer(); // 返回的 inner 函数是一个闭包
counter(); // 输出 1
counter(); // 输出 2

在这个例子中,inner 函数形成了一个闭包,它可以访问 outer 函数的 count 变量,即使 outer 函数已经返回。

7. 变量提升 (Hoisting)

JavaScript 中,使用 var 声明的变量会被提升到函数作用域的顶部,但不会初始化。也就是说,在声明之前访问变量会得到 undefined。但是 letconst 声明的变量是不会提升的,访问它们会导致错误。

console.log(a); // 输出 undefined
var a = 10;

console.log(b); // 报错: ReferenceError: Cannot access 'b' before initialization
let b = 20;

小结

  • 全局作用域:在整个程序中都可访问的作用域。
  • 函数作用域:函数内部的作用域。
  • 块级作用域:通过 letconst 引入的作用域,限定在代码块内部。
  • 词法作用域:作用域的查找顺序在编译时就已经决定。
  • 闭包:函数能“记住”并访问它创建时的作用域。
  • 作用域链:访问变量时,JavaScript 会沿着作用域链逐层查找。

掌握 JavaScript 作用域的规则有助于避免很多常见的错误,并帮助开发者编写更干净和可维护的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2243040.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python爬虫----python爬虫基础

一、python爬虫基础-爬虫简介 1、现实生活中实际爬虫有哪些? 2、什么是网络爬虫? 3、什么是通用爬虫和聚焦爬虫? 4、为什么要用python写爬虫程序 5、环境和工具 二、python爬虫基础-http协议和chrome抓包工具 1、什么是http和https协议…

从北美火到中国,大数据洞察品牌“STANLEY”的突围之路

保守直筒大头的“硬汉”外形,以百变颜色踩中时尚命脉,与各路大牌“梦幻联动”,不少时尚弄潮儿没能逃过其“真香”诱惑。 这就是今年以来从北美火到中国的STANLEY,在“巨无霸”水杯中突围出属于自己的一条路。 最近STANLEY又整活…

Java结合ElasticSearch根据查询关键字,高亮显示全文数据。

由于es高亮显示机制的问题。当全文内容过多,且搜索中标又少时,就会出现高亮结果无法覆盖全文。因此需要根据需求手动替换。 1.根据es的ik分词器获取搜索词的分词结果。 es部分: //中文分词解析 post /_analyze {"analyzer":"…

Python绘制雪花

文章目录 系列目录写在前面技术需求完整代码代码分析1. 代码初始化部分分析2. 雪花绘制核心逻辑分析3. 窗口保持部分分析4. 美学与几何特点总结 写在后面 系列目录 序号直达链接爱心系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4…

Linux性能优化之火焰图简介

Linux 火焰图(Flame Graph)是一种可视化工具,用于分析程序性能问题,尤其是 CPU 使用情况。它展示了程序中函数调用的层次结构和各个调用栈占用的时间比例。 以下是详细介绍,包括火焰图的工作原理、生成步骤和实际使用中…

Axure设计之文本编辑器制作教程

文本编辑器是一个功能强大的工具,允许用户在图形界面中创建和编辑文本的格式和布局,如字体样式、大小、颜色、对齐方式等,在Web端实际项目中,文本编辑器的使用非常频繁。以下是在Axure中模拟web端富文本编辑器,来制作文…

Python中的正则表达式教程

一、 正则表达式基础 1。1。概念介绍 正则表达式是用于处理字符串的强大工具,它并不是Python的一部分。 其他编程语言中也有正则表达式的概念,区别只在于不同的编程语言实现支持的语法数量不同。 它拥有自己独特的语法以及一个独立的处理引擎,在提供了正则表达式…

脑机接口、嵌入式 AI 、工业级 MR、空间视频和下一代 XR 浏览器丨RTE2024 空间计算和新硬件专场回顾

这一轮硬件创新由 AI 引爆,或许最大受益者仍是 AI,因为只有硬件才能为 AI 直接获取最真实世界的数据。 在人工智能与硬件融合的新时代,实时互动技术正迎来前所未有的创新浪潮。从嵌入式系统到混合现实,从空间视频到脑机接口&…

Python爬虫下载新闻,Flask展现新闻(2)

上篇讲了用Python从新闻网站上下载新闻,本篇讲用Flask展现新闻。关于Flask安装网上好多教程,不赘述。下面主要讲 HTML-Flask-数据 的关系。 简洁版 如图,页面简单,主要显示新闻标题。 分页,使用最简单的分页技术&…

Linux下编译MFEM

本文记录在Linux下编译MFEM的过程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1Boost1.74.0oneAPI2024.2.1 一、安装依赖 二、编译代码 附录I: CMakeUserPresets.json {"version": 4,"configurePresets": [{&quo…

Win10/11 安装使用 Neo4j Community Edition

如果你下载的是 Neo4j Community Edition 的压缩包,意味着你需要手动解压并配置 Neo4j。以下是详细的使用步骤: 0. 下载压缩包 访问Neo4j官网,找到 Community Edition 版本并选择 4.x 或者 5.x 下载:https://neo4j.com/deployme…

Spring Boot教程之Spring Boot简介

Spring Boot 简介 接下来一段时间,我会持续发布并完成Spring Boot教程 Spring 被广泛用于创建可扩展的应用程序。对于 Web 应用程序,Spring 提供了 Spring MVC,它是 Spring 的一个广泛使用的模块,用于创建可扩展的 Web 应用程序。…

基于java+SpringBoot+Vue的智能物流管理系统设计与实现

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

智能零售柜商品识别

项目源码获取方式见文章末尾! 600多个深度学习项目资料,快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

【Mysql】Mysql函数(上)

1、概述 在Mysql中,为了提高代码重用性和隐藏实现细节,Mysql提供了很多函数。函数可以理解为封装好的模块代码。 2、分类 在Mysql中,函数非常多,主要可以分为以下几类: (1)聚合函数 &#xf…

sql数据库-分页查询-DQL

目录 语法 注意 举例 语法 select 字段列表 from 表名 limit 起始索引,查询记录数; 注意 起始索引:即从第几条数据开始分页,简单理解为起始索引(查询页码-1)* 每页显示数据 分页查询在不同的数据库中有不同的方法。 查询第一页…

vue使用List.reduce实现统计

需要对集合的某些元素的值进行计算时,可以在计算属性中使用forEach方法 1.语法:集合.reduce ( ( 定义阶段性累加后的结果 , 定义遍历的每一项 ) > 定义每一项求和逻辑执行后的返回结果 , 定义起始值 ) 2、简单使用场景:例如下面…

CVE-2024-2961漏洞的简单学习

简单介绍 PHP利用glibc iconv()中的一个缓冲区溢出漏洞,实现将文件读取提升为任意命令执行漏洞 在php读取文件的时候可以使用 php://filter伪协议利用 iconv 函数, 从而可以利用该漏洞进行 RCE 漏洞的利用场景 PHP的所有标准文件读取操作都受到了影响&#xff1…

关系型数据库和非关系型数据库详解

文章目录 关系型数据库和非关系型数据库详解一、引言二、关系型数据库1、关系型数据库简介1.1、SQL语言 2、关系型数据库的实际应用3、关系型数据库的优点4、关系型数据库的缺点 三、非关系型数据库1、非关系型数据库简介1.1、灵活性示例 2、非关系型数据库的分类3、非关系型数…

STM32设计井下瓦斯检测联网WIFI加Zigbee多路节点协调器传输

目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 本系统基于STM32微控制器和Zigbee无线通信技术,设计了…