揭开 JavaScript 作用域的神秘面纱(下)

在这里插入图片描述

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6
🍨 阿珊和她的猫_CSDN个人主页
🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》
🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

  • 闭包
    • 闭包的定义和特点
    • 闭包的应用场景和优势
    • 避免闭包引起的内存泄漏问题
  • 作用域的最佳实践
    • 合理使用作用域,避免变量命名冲突
    • 利用闭包实现私有成员和模块化编程
  • 总结
    • 回顾 JavaScript 作用域的重要概念和特点
    • 强调理解和运用作用域的重要性

闭包

闭包的定义和特点

闭包是指在函数内部创建一个独立的作用域,该作用域中的变量和函数可以在函数外部被访问。即使函数执行完毕,闭包中的变量和函数仍然可以被访问。闭包具有以下特点:

  1. 函数嵌套函数:闭包必须有函数嵌套函数的结构。

  2. 内部函数可以访问外部函数的变量:内部函数可以访问外部函数中的变量,即使外部函数已经执行完毕。

  3. 外部函数返回内部函数:外部函数必须返回内部函数,才能形成闭包。

在这里插入图片描述

闭包的应用场景和优势

闭包的应用场景和优势包括:

  1. 模块封装:闭包可以将相关的代码和数据封装在一起,形成一个独立的模块。

  2. 私有成员:通过闭包,可以创建私有成员,只在闭包内部访问。

  3. 缓存数据:闭包可以用来缓存数据,避免重复计算。

  4. 函数柯里化:闭包可以将多个参数的函数转化为接受一个参数的函数。

在这里插入图片描述

避免闭包引起的内存泄漏问题

为了避免闭包引起的内存泄漏问题,可以采取以下措施:

  1. 及时释放内存:在不需要使用闭包时,及时释放闭包所占用的内存。

  2. 使用WeakMap:WeakMap 可以存储对对象的弱引用,当对象不再被引用时,WeakMap 中的键值对会自动被垃圾回收。

  3. 避免创建不必要的闭包:尽量避免创建不必要的闭包,只在需要时创建。

在这里插入图片描述

通过理解闭包的定义、特点、应用场景和优势,以及采取适当的措施避免内存泄漏问题,可以更好地利用闭包这一特性。

作用域的最佳实践

作用域的最佳实践包括合理使用作用域,避免变量命名冲突,以及利用闭包实现私有成员和模块化编程。以下是具体的说明和代码案例:

合理使用作用域,避免变量命名冲突

  1. 合理使用作用域:在 JavaScript 中,作用域可以分为全局作用域和函数作用域。应该尽量避免在全局作用域中定义变量,因为这可能导致命名冲突。更好的做法是在函数内部定义变量,这样可以限制变量的可见性,避免命名冲突。
// 全局作用域
let globalVariable = 'This is a global variable';

function func1() {
  // 函数作用域
  let localVariable = 'This is a local variable';
  console.log(globalVariable);
  console.log(localVariable);
}

func1();

在上面的代码中,globalVariable 是在全局作用域中定义的,因此在函数内部和外部都可以访问。而 localVariable 是在函数内部定义的,只能在函数内部访问。

  1. 避免变量命名冲突:在复杂的代码中,可能会出现变量命名冲突的问题。为了避免这种情况,可以使用命名空间或驼峰命名法等技巧。
// 使用命名空间
let namespace = {
  variable1: 'Value 1',
  variable2: 'Value 2',
};

console.log(namespace.variable1);
console.log(namespace.variable2);

// 使用驼峰命名法
let camelCaseVariable = 'Value';
console.log(camelCaseVariable);

在上面的代码中,使用命名空间可以将相关的变量组织在一起,避免命名冲突。而使用驼峰命名法可以通过增加变量名的可读性来减少命名冲突的可能性。

利用闭包实现私有成员和模块化编程

  1. 利用闭包实现私有成员和模块化编程:闭包可以用来创建私有成员,只在闭包内部访问。这对于实现模块化编程非常有用。
function createPrivateMember() {
  let privateVariable = 'Private value';

  function accessPrivateVariable() {
    console.log(privateVariable);
  }

  return accessPrivateVariable;
}

let privateFunction = createPrivateMember();
privateFunction(); 

在上面的代码中,createPrivateMember 函数返回了一个内部函数 accessPrivateVariable。这个内部函数可以访问私有变量 privateVariable,而外部无法直接访问。

通过使用闭包,可以将相关的代码和数据组织在一起,形成一个独立的模块,提高代码的可维护性和复用性。

总之,合理使用作用域、避免变量命名冲突以及利用闭包实现私有成员和模块化编程是作用域的最佳实践。这些实践可以帮助编写更清晰、可维护和避免错误的代码。

总结

回顾 JavaScript 作用域的重要概念和特点

JavaScript 作用域是指变量和函数在程序中的可访问范围。它有以下几个重要概念和特点:

  1. 全局作用域:在 JavaScript 中,变量和函数可以在全局作用域中定义,这意味着它们可以在整个程序中被访问。全局作用域中的变量和函数可以通过 window 对象来访问。

  2. 函数作用域:当在函数内部定义变量和函数时,它们只在该函数内部可访问,这被称为函数作用域。函数作用域中的变量和函数是私有的,外部无法访问。

  3. 块级作用域:ES6 引入了块级作用域,使用花括号 {} 包裹的代码块中定义的变量只在该代码块内部可访问。

  4. 作用域链:JavaScript 中的作用域是通过作用域链来实现的。当访问一个变量时,JavaScript 会从当前执行上下文开始向上查找,直到找到该变量的定义。

  5. 闭包:闭包是指在函数内部创建一个独立的作用域,该作用域中的变量和函数可以在函数外部被访问。即使函数执行完毕,闭包中的变量仍然可以被访问。

理解 JavaScript 作用域的概念和特点对于编写可维护和可靠的代码非常重要。合理使用作用域可以避免变量命名冲突,提高代码的可读性和可维护性。

强调理解和运用作用域的重要性

理解和运用 JavaScript 作用域的重要性不可忽视。以下是一些原因:

  1. 避免命名冲突:通过合理使用作用域,可以限制变量和函数的可见性,从而避免在不同的作用域中使用相同的变量名或函数名导致的命名冲突。

  2. 提高代码可读性:明确的作用域结构可以让代码更容易理解。当代码中变量和函数的作用域清晰时,读者可以更轻松地跟踪变量的赋值和函数的调用,提高代码的可读性。

  3. 增强代码的可维护性:理解作用域有助于更好地组织和管理代码。当需要修改代码时,可以更自信地知道哪些变量和函数可以安全地修改,而不会影响到其他部分的代码。

  4. 避免副作用:在函数中使用局部变量可以避免全局变量的副作用。全局变量可能被其他部分的代码修改,从而导致意外的结果。通过使用函数作用域,将变量限制在函数内部,可以更好地控制变量的变化。

  5. 实现模块化编程:闭包是 JavaScript 中一种强大的模块化编程技术。通过创建闭包,可以将相关的变量和函数封装在一起,形成一个独立的模块,方便代码的复用和维护。

总之,理解和运用 JavaScript 作用域是编写高质量 JavaScript 代码的基础。它可以帮助避免常见的错误,提高代码的可读性和可维护性,并使代码更模块化和易于扩展。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Halcon计算最小外接矩形Smallest_rectangle2

Halcon计算最小外接矩形Smallest_rectangle2 该算子用于求最小外接矩形。该算子的原型如下: smallest _rectangle2 (Regions : : : Row, Column, Phi, Lengthl, Length2)其各参数的含义如下。 参数1:Regions 表示输入的区域。 参数2和3:Row…

如何通过HACS+Cpolar实现远程控制米家和HomeKit等智能家居设备

文章目录 基本条件一、下载HACS源码二、添加HACS集成三、绑定米家设备 ​ 上文介绍了如何实现群晖Docker部署HomeAssistant,通过内网穿透在户外控制家庭中枢。本文将介绍如何安装HACS插件商店,将米家,果家设备接入 Home Assistant。 基本条件…

Spring AI和Ollama

概述 Spring AI 不仅提供了与 OpenAI 进行API交互,同样支持与 Ollama 进行API交互。Ollama 是一个发布在GitHub上的项目,专为运行、创建和分享大型语言模型而设计,可以轻松地在本地启动和运行大型语言模型。 Docker环境安装Ollama 1.获取D…

python 模块搜索路径

前言 当我们import os的时候,Python解释器去哪找os模块呢?如果多处都有os模块,选择哪个os模块呢? 去哪找os模块? Python解释器不是很神奇,它会从以下2个地方找os模块 1、内置模块 sys.builtin_module_nam…

ROS-arbotix安装

方式一:命令行输入: sudo apt-get install ros-melodic-arbotix如果ROS为其他版本,可将melodic替换为对应版本。 方式二: 先从 github 下载源码,然后调用 catkin_make 编译 git clone https://github.com/vanadiumla…

P59 生成式对抗网络GAN-理论介绍 Theory behind GAN

Object Normal Distribution 的数据 经过 Generator 后生成分布更加复杂的PG. 真实数据的分布为 Pdata , 希望 PG和Pdata 越近越好 LOSS 是 两者之间的分布距离 问题: 如何计算 divergence? Sampling is goog enough Discriminator 希望V越大越好 y~Pdata 代表从 Pdata里…

项目整合积木报表-设计页面

项目整合积木报表-设计页面 <template><div><iframe id"dome" :srcsrc ></iframe></div> </template><script>export default {data(){return{src:configSrc.src"/jmreport/view/836138868821839872"}}} </…

BMTrain来高效训练预训练模型-大模型的福音

一.背景知识 在2018年&#xff0c;预训练语言模型技术的出现成为人工智能领域一场革命性的变革。研究表明&#xff0c;通过增加模型参数量和训练数据规模&#xff0c;可以有效提升语言模型的性能&#xff0c;因此十亿、百亿甚至千亿级大模型的探索成为业界的热门话题。这一趋势…

《网络是怎样连接的》2.3节图表(自用)

图4.1&#xff1a;TCP拆分数据与ACK号 图4.2&#xff1a;实际工作中ACK号与序号的交互过程 首先&#xff0c;客户端在连接时需要计算出与从客户端到服务器方向通信相关的序号初始值&#xff0c;并将这个值发送给服务器&#xff08;①&#xff09;。 接下来&#xff0c;服务器会…

macOS 老版本系统恢复中出现“MacBook Pro无法与恢复服务器取得联系”

macOS 老版本系统恢复中出现“MacBook Pro无法与恢复服务器取得联系” 网络问题系统时间问题镜像索引问题 网络问题 系统时间问题 镜像索引问题 恢复模式的 “实用工具 > 系统终端” 里执行如下 nvram IASUCatalogURLhttps://swscan.apple.com/content/catalogs/others/i…

PDF.js实现搜索多个不同的关键词高亮显示效果

static\PDF\web\viewer.js 392行左右 // 自定义搜索关键词---------------------------------------- this.searchKeywords = keyword => {if (typeof PDFViewerApplication !== undefined) {PDFViewerApplication.eventBus.dispatch(find, {query: keyword,caseSensitive:…

环境配置 | 史上最详细的Anaconda安装教程

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。Anaconda是Python的一个发行版&#xff0c;它是一个集成了Python开发工具的平台&#xff0c;也是数据科学的利器。安装Anaconda可以方便地获取Python及其相关工具和库&#xff0c;而无需单独安装Python。&#x1f308; 目…

程序媛的mac修炼手册-- 靠谱的数据源网站

啊&#xff0c;今天还是要给大伙儿安利些干货&#xff0c;方才对得起大伙儿的关注支持啊&#xff5e; 我最开始用Mac&#xff0c;主要是做数据分析的。包括R语言、Python语言&#xff0c;这些分析工具在Mac上运行地都很流畅。但我很少用Mac自带的电子表单应用程序Numbers&…

小程序如何配置扫码点餐功能

在餐饮行业中&#xff0c;通过小程序扫码点餐是一种非常方便和高效的方式。下面具体介绍怎么给小程序设置扫码点餐功能。 一、给每个桌子设置单独的小程序码。管理员点击个人中心->我的管理->更多->门店码。 生成小程序码页面&#xff0c;各个字段解释如下。 会员卡…

【Sublime Text】| 02——常用插件安装及配置

系列文章目录 【Sublime Text】| 01——下载软件安装并注册 【Sublime Text】| 02——常用插件安装及配置 失败了也挺可爱&#xff0c;成功了就超帅。 文章目录 1. 汉化2. 更换颜色主题3. 更改编码插件—ConvertToUTF84. 对齐插件—Alignment5. 括号高亮插件—BracketHighligh…

HTML5大作业-精致版个人博客空间模板源码

文章目录 1.设计来源1.1 博客主页界面1.2 博主信息界面1.3 我的文章界面1.4 我的相册界面1.5 我的工具界面1.6 我的源码界面1.7 我的日记界面1.8 我的留言板界面1.9 联系博主界面 2.演示效果和结构及源码2.1 效果演示2.2 目录结构2.3 源代码 源码下载 作者&#xff1a;xcLeigh …

GPT/GPT4科研应用与AI绘图技术及论文高效写作教程

详情点击链接&#xff1a;GPT/GPT4科研实践应用与AI绘图技术及论文高效写作教程 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析&#xff0c;AI画图&#xff0c;图像识别&#xff0c;文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型…

深入浅出XTTS:Oracle数据库迁移升级利器

演讲大纲&#xff1a; 1. 什么是XTTS 2. 适用场景 3. XTTS的基本操作步骤 4. XTTS案例分享 今天主要跟大家分享一下XTTS,在网上曾看过相关讨论,但发现按网上讲的那些去实际操作的话,还是会遇到一些坑,并不能实际落下来,所以今天想跟大家分享一些实战干货. 一、什么是XTTS …

知识付费平台搭建?找明理信息科技,专业且高效

明理信息科技知识付费saas租户平台 在当今数字化时代&#xff0c;知识付费已经成为一种趋势&#xff0c;越来越多的人愿意为有价值的知识付费。然而&#xff0c;公共知识付费平台虽然内容丰富&#xff0c;但难以满足个人或企业个性化的需求和品牌打造。同时&#xff0c;开发和…

C#,快速排序算法(Quick Sort)的非递归实现与数据可视化

排序算法是编程的基础。 常见的四种排序算法是&#xff1a;简单选择排序、冒泡排序、插入排序和快速排序。其中的快速排序的优势明显&#xff0c;一般使用递归方式实现&#xff0c;但遇到数据量大的情况则无法适用。实际工程中一般使用“非递归”方式实现。 快速排序(Quick Sor…