深入解析JavaScript中的变量作用域和闭包

news2025/1/11 15:07:07

🧑‍🎓 个人主页:《爱蹦跶的大A阿》

🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》

​ 

✨ 前言

        JavaScript作为一门解释执行的脚本语言,其变量作用域与传统编译型语言有着明显的区别。理解JavaScript的作用域与闭包对编写优雅可靠的JavaScript代码非常重要。

        本文将详细介绍JavaScript中变量的作用域规则,以及利用闭包实现的常见作用域应用场景,帮助读者进一步掌握JavaScript编程。

✨ 正文

JavaScript的作用域

        JavaScript采用词法作用域(lexical scope),也就是静态作用域。函数的作用域在定义时就决定了。

主要的作用域规则:

  • 函数内部可以访问函数外部的变量
  • 函数外部无法访问函数内部的变量
  • JavaScript没有块级作用域,只有函数作用域
const value = 'outer';

function foo() {
  const value = 'inner';
  // 这里访问外部的value变量
}

        JavaScript采用的是词法作用域(lexical scope),也就是静态作用域。这意味着变量的作用域在定义时就确定了,与代码的执行位置无关。

JavaScript的作用域有以下几种情况:

  • 全局作用域

        在全局代码中声明的变量拥有全局作用域,在代码的任何地方都可以访问。

  • 函数作用域

        每个函数都定义了一个新的作用域,该函数内部可以访问全局变量以及函数的参数和局部变量。

  • 块级作用域

        JavaScript 没有块级作用域,if代码块、for循环等并不能形成作用域,所以块内声明的变量会泄漏到函数或全局作用域。

  • 词法作用域

        内部函数可以访问外部函数定义的变量,这称为闭包。

  • 动态作用域

        JavaScript没有动态作用域,函数的作用域在定义时 Establish 而不会改变。

        一个变量的作用域实际上是指该变量存在的区域。明确变量的作用域可以避免访问错误或者命名冲突等问题。

 

闭包的定义

闭包(closure)指一个函数及其相关的引用环境组合。简单来说,在一个函数内部创建的函数可以访问到该函数的变量。

function outer() {
  const value = 'hello';

  function inner() {
    console.log(value); // 访问外部函数的变量
  }

  return inner;
}

闭包的常见应用场景

闭包的常见应用场景包括:

  1. 封装私有变量
  2. 模块化编程
  3. 实现函数柯里化
  4. 缓存或记忆功能
  5. ...

 

✨ 结语      

        JavaScript的作用域与传统编译型语言有明显区别,理解这些区别可以避免代码编写中的问题。

        闭包是JavaScript中很重要的一个特性,合理利用闭包可以编写出更优雅、高效的代码。

        要成为JavaScript高手,作用域和闭包都是必学的重要内容。本文内容可以帮助读者加深对其理解。在未来的编码中也要不断 practise,进一步掌握JavaScript的精髓。

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

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

相关文章

Elasticsearch Windows部署-ELK技术栈

1、下载Elasticsearch、kibana、logstash 本文不介绍ELK相关原理知识,只记录部署操作过程 下载地址Past Releases of Elastic Stack Software | Elastic 选择同一版本,这里选择是当前最新版本8.11.3 解压放在同目录下,方便后续操作与使用 …

Linux网络文件共享服务

目录 一.文件存储类型 1.直连式存储:Direct-Attached Storage,简称DAS 2.存储区域网络:Storage Area Network,简称SAN(可以使用空间,管理也是你来管理) 3.网络附加存储:Network-…

卡尔曼滤波基本原理详解

卡尔曼滤波 卡尔曼滤波简介 卡尔曼滤波器(Kalman Filter)是一种高效的递推滤波器(即基于上一个时刻的估计来更新当前时刻的估计),它能够从一系列含有噪声的观测数据中估计动态系统的状态。它在1960年由鲁道夫卡尔曼提…

kubectl与 jq的另外一些用法

背景: 在日常运维工作中,我们需要管理和操作大量的配置文件,这在使用 Kubernetes 集群管理应用时尤为常见。Kubernetes 提供了一个名为 ConfigMap 的资源对象,它用于存储应用的配置信息。有时,我们需要查找哪些 Confi…

第二证券:旅游股大涨 “预热”春节黄金周

在淄博烧烤热、哈尔滨冰雪热火爆出圈后,希望能接住文旅下一波“泼天富贵”的各地文旅局各出奇招并“卷”出新高度,被各地网友谈论“杀疯了”。 其间,A股游览概念股迎来一波集体上涨,成为不少出资者的重视热点,而行将到…

【原创】docker +宝塔+安装zabbix

Zabbix: Zabbix可以监控各种网络服务、服务器和网络设备,而无需在目标设备上安装客户端。它的强大之处在于自带的Web界面,能够提供实时监控和各种报警功能。方法1: 步骤 创建Docker Compose文件: 首先,你需要创建一个docker-comp…

FFmpeg之AVFormat

文章目录 一、概述二、解封装流程三、重要结构体3.1、AVFormatContext3.2、AVInputFormat3.3、AVOutputFormat3.4、AVStream 四、重要函数分析4.1、avformat_alloc_context4.2、avformat_open_input4.2.1、init_input4.2.2、av_probe_input_format2 4.3、avformat_find_stream_…

如何在几分钟内创建AI工具

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情 完成这篇文章后,您将在不到 2 分钟的时间内构建您的第一个 AI 工具,而无需编写任何代码! 您只需使用我将在这里与您分享的脚本…

JVM内存模型/运行时数据区域

java虚拟机管理这块内存,所以我们也叫运行时数据区域 总览 这里按线程是否共享来分类,所谓线程不共享就是每个线程里面都会配一套 程序计数器 栈, 互相不干涉。 而方法区和堆是线程所有共享 意味着只有一个(这里注意堆是实际概念…

第二证券:行业术语解读:CPO概念是什么意思?

cpo概念又名共封装光学概念,它是指把硅光模块和CMOS芯片用高级封装的方法耦合在背板PCB上,从而在成本、功耗和尺度上都进一步提升数据中心使用中的光互联技能等相关上市公司组成的概念。 概念股,并不特指于某一支股,而是一个选股话…

SV-8004VP 网络对讲求助话筒,4个自定义按键

SV-8004VP网络对讲求助话筒,4个自定义按键 SV-8004VP是一款4按键求助对讲话筒,具有10/100M以太网接口,支持G.711音频编解码,其接收SIP网络的音频数据,实时解码播放,还配置了麦克风输入和扬声器输出。 SV-…

什么是非电离辐射与电离辐射?

摘要: 非电离辐射和电离辐射是两种不同类型的辐射,它们主要区别在于能量水平和与物质相互作用的方式。 非电离辐射 非电离辐射是指能量较低,不足以使原子或分子的电子脱离其原子核束缚而产生电离现象的电磁波。这类辐射不 ... 非电离辐射和电离辐射是两…

Bazel

简介: Bazel 是 google 研发的一款开源构建和测试工具,也是一种简单、易读的构建工具。 Bazel 支持多种编程语言的项目,并针对多个平台构建输出。 高级构建语言:Bazel 使用一种抽象的、人类可读的语言在高语义级别上描述项目的构建属性。与其…

【遥感专题系列】影像信息提取之——面向对象的影像分类技术

“同物异谱,同谱异物”会对影像分类产生的影响,加上高分辨率影像的光谱信息不是很丰富,还有经常伴有光谱相互影响的现象,这对基于像素的分类方法提出了一种挑战,面向对象的影像分类技术可以一定程度减少上述影响。 本…

git 删除 submodule 子模块的步骤

实验有效,这里删除了两个 submodule。 1, 执行删除 submodule mkdir tmp1 && cd tmp1 && git clone --recursive ssh://gitaaa.bbb.ccc.git \ && cd ccc/ && git checkout -b abranch_01 \ && git submodule deinit -f…

初识物联网

1:什么是IOT: 物联网的英文名称是Internet of Things。IoT则是Internet of Things的缩写。因此, 物联网 IoT。 通俗地说,物联网是互联网的一种拓展。我们知道互联网是由无数的计算机和智能手机交错连接而编织成的一张网。而正是有了像NodeM…

半监督学习 - 三元组学习(Triplet Learning)

什么是机器学习 三元组学习(Triplet Learning)是半监督学习中一种用于学习有用表示的方法。它通常用于学习数据中的相似性关系,尤其在人脸识别、图像检索等领域中得到广泛应用。三元组学习是通过构造三元组(triplet)来…

java版直播商城平台规划及常见的营销模式 电商源码/小程序/三级分销+商城 免 费 搭 建

鸿鹄云商 B2B2C产品概述 【B2B2C平台】,以传统电商行业为基石,鸿鹄云商支持“商家入驻平台自营”多运营模式,积极打造“全新市场,全新 模式”企业级B2B2C电商平台,致力干助力各行/互联网创业腾飞并获取更多的收益。从消…

【云原生】springboot 整合 OpenTelemetry

目录 一、前言 二、应用可观测性概述 2.1 什么是可观测性 2.2 可观测性三大指标 2.2.1 指标(Metrics) 2.2.2 日志(log) 2.2.3 追踪(Traces) 三、OpenTelemetry 介绍 3.1 什么是OpenTelemetry 3.2 OpenTelemetry架构和组件…

༺༽༾ཊ—设计-七个原则-模式—ཏ༿༼༻

第一原则:单一职责 一个类只负责一个功能领域中的相应职责; 接下来我们举一个代码例子,主要的功能实现是: 在主函数中运行调用描边工具和填充工具画矩形与圆形 首先写一个圆形类,里面只有一个方法用来返回string类型…