JavaScript 闭包:让你更深入了解函数和作用域

在这里插入图片描述

🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》
🍚 蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

    • 摘要:
    • 引言:
    • 正文:
      • 1. 闭包的定义和原理🔗
      • 2. 闭包的应用场景🔨
      • 3. 闭包的注意事项📝
    • 总结:🎯
    • 参考资料:📚

摘要:

💡 本文将带你深入了解 JavaScript 中的闭包,这是一种强大的功能,可以让函数记住并访问其创建时所在的作用域,即使函数在一个不同的作用域被调用。通过闭包,我们可以实现私有变量和模块化代码,提高代码的可读性和可维护性。

引言:

🌱 大家好,我是阿珊。在 JavaScript 中,闭包是一个让人又爱又恨的概念。它既可以让我们编写出灵活高效的代码,也可能成为解决问题的陷阱。今天,我将和大家一起探讨闭包的原理和应用,帮助大家更好地掌握这一知识点。

正文:

1. 闭包的定义和原理🔗

闭包是指那些能够访问自由变量的函数。自由变量是指在函数中使用的,但既不是函数参数也不是函数的局部变量的变量。闭包可以让函数记住并访问其创建时所在的作用域,即使函数在一个不同的作用域被调用。
示例代码如下:

function createCounter() {
  let count = 0;
  return function() {
    return count++;
  };
}
const counter = createCounter();
console.log(counter()); // 0
console.log(counter()); // 1
console.log(counter()); // 2

2. 闭包的应用场景🔨

(1)实现私有变量🔒
闭包可以用来实现私有变量,防止外部直接访问和修改。

function createPerson(name) {
  let _age = 25;
  return {
    getName: function() {
      return name;
    },
    getAge: function() {
      return _age;
    },
    setAge: function(age) {
      _age = age;
    }
  };
}
const person = createPerson("Alice");
console.log(person.getName()); // Alice
console.log(person.getAge()); // 25
person.setAge(30);
console.log(person.getAge()); // 30

(2)模块化代码📦
闭包可以帮助我们将相关的函数和变量组合在一起,提高代码的可读性和可维护性。

const myModule = (function() {
  const privateVar = "I'm private";
  function privateMethod() {
    console.log(privateVar);
  }
  return {
    publicMethod: function() {
      privateMethod();
    }
  };
})();
myModule.publicMethod(); // I'm private

3. 闭包的注意事项📝

(1)避免在循环中使用闭包🚫
如果在循环中使用闭包,可能会导致内存泄漏。

for (let i = 0; i < 10; i++) {
  setTimeout(function() {
    console.log(i); // 输出 10 个 10
  }, 1000 * i);
}

(2)注意闭包和 this 的关系🤔
在非严格模式下,闭包中的 this 指向全局对象。在严格模式下,闭包中的 this 指向 undefined。

const obj = {
  name: "Alice",
  sayName: function() {
    return function() {
      console.log(this.name);
    };
  }
};
const sayName = obj.sayName();
sayName(); // Alice

总结:🎯

本文介绍了 JavaScript 中的闭包,这是一种可以让函数记住并访问其创建时所在的作用域的功能。通过闭包,我们可以实现私有变量和模块化代码,提高代码的可读性和可维护性。同时,我们还讨论了闭包的注意事项,以便大家能够在实际开发中更好地运用这一知识点。

参考资料:📚

  1. JavaScript 闭包
  2. JavaScript 高级程序设计

感谢大家的阅读,希望这篇文章能帮助到你!💖如果你有任何问题或建议,欢迎在评论区留言哦

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

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

相关文章

Mybatis框架相关问题

HashMap相关问题 部分示例代码 Mybatis框架相关问题 一、MyBatis框架是如何实现分页的&#xff1f;二、MyBatis框架里面的缓存机制是怎么回事&#xff1f;一级缓存二级缓存 一、MyBatis框架是如何实现分页的&#xff1f; 分页分为两种&#xff1a; 逻辑分页&#xff1a;将所…

直播美颜SDK开发指南:构建个性化的主播美颜工具

本篇文章&#xff0c;小编将带您深入了解如何构建个性化的主播美颜工具&#xff0c;从而为用户提供更优质的直播体验。 一、美颜技术概述 在开始SDK的开发之前&#xff0c;我们首先需要了解美颜技术的基本原理。美颜技术通常包括肤色检测、人脸检测、特征点定位、滤镜处理等步…

C++ 使用libmodbus通信示例

代码示例 #include <future> #include <iostream> #include <thread>#include <modbus.h>// 寄存器数量 #define TEST_MAX_REGISTERS 100 // 读取寄存器数量 #define TEST_MAX_READ 5int main() {// C 异步auto&& f1 std::async(std::launch…

绘图设计:用Draw.io绘制图形技巧大全(含统一建模语言UML模板)

一、常见UML模板 1.流程图 2.用例图 include是包含关系&#xff0c;extend是扩展关系 简而言之&#xff0c;include是子集指向父集&#xff1b;而extend是扩展用例指向基础用例&#xff08;基础用例可以理解为系统核心功能&#xff0c;扩展用例是可选的&#xff0c;不是必须…

Redis-1

1. Redis 功能强大&#xff0c;持续改进&#xff0c;经久不衰 1.高性能 底层C语言编写&#xff0c;内存数据库&#xff0c;通讯采用epoll非阻塞l/O多路复用机制 2.线程安全 3.功能丰富 数据结构&#xff1a; 基本&#xff1a;String、LIst、HashSet、SortredSet 高阶&…

Covalent Network(CQT)构建 Web3 最大的结构化数据集,开拓AI、安全性和数据质量的融合

人工智能浪潮正在对各行各业进行重塑&#xff0c;随着格局的不断演变&#xff0c; Covalent Network&#xff08;CQT&#xff09;正在成为核心参与者。人工智能以其对庞大的结构化数据集的依赖而闻名&#xff0c;而 Covalent Network&#xff08;CQT&#xff09;的广泛数据集正…

VS2019中引发了异常,写入访问权限冲突。

我把出现的问题从项目中剥离了出来&#xff0c;然后再看&#xff0c;发现自己有点傻。 但因为项目中代码有点多&#xff0c;也是debug了一会儿才发现问题。 参考&#xff1a; vs引发了异常: 读取访问权限冲突_qt vs 引发了异常: 读取访问权限冲突。 **other** 是 0x10。-CSD…

【C++】二叉树进阶面试题(下)

目录 6. 根据一棵树的前序遍历与中序遍历构造二叉树 题目 分析 代码 7. 根据一棵树的中序遍历与后序遍历构造二叉树 题目 分析 代码 8. 二叉树的前序遍历&#xff0c;非递归迭代实现 题目 分析 代码 9. 二叉树中序遍历 &#xff0c;非递归迭代实现 题目 分析 …

什么是5G边缘计算网关?

随着5G技术的飞速发展和普及&#xff0c;边缘计算作为5G时代的关键技术之一&#xff0c;正日益受到业界的关注。而5G边缘计算网关&#xff0c;作为连接5G网络和边缘计算节点的桥梁&#xff0c;扮演着至关重要的角色。HiWoo Box&#xff0c;作为一款卓越的5G边缘计算网关&#x…

在虚拟机vm下的Linux系统下 安装redis 超详细

打开Linux后 右键打开终端 1.输入:su root 登录root 密码是123456 2.然后输入:yum -y install gcc-c 安装gcc基础依赖包 3.yum -y install centos-release-scl 4.yum -y install devtoolset-9-gcc devtoolset-9-gcc-c devtoolset-9-binutils //为了编译最新版本的Redis源码 用…

数据分析案例-二手车用户数据可视化分析(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

哪种杠杆最安全?允许的最低杠杆是多少?WeTrade一篇文章讲清楚

各位投资者都知道外汇交易中的财务杠杆其实就是一种期权&#xff0c;允许交易者以数倍于交易保证金的实际金额进行交易。保证金交易的一种工具&#xff0c;这就是投资者借入的资金&#xff0c;用于增加持仓量&#xff0c;从而增加自己的利润&#xff0c;避免自己的资金不足。We…

MS8911S/8921S/8922M/8931S——4ns 延时、轨到轨高速比较器

产品简述 MS8911S/MS8921S/MS8922M/MS8931S 是一款具 有内部迟滞的高速比较器。其电源电压范围为 3.0V- 5.5V &#xff0c;输入和输出范围均可做到轨到轨。其输出为推 挽结构&#xff0c;兼容 CMOS/TTL 逻辑电平标准。传输延时为 4ns &#xff0c;且失调电压低。单一比…

7种数组排序算法(多语言描述)

912. 排序数组 冒泡排序 C void bubble_sort(vector<int>& nums) {bool sorted false;int N nums.size();while (!sorted) {sorted true;for (int i 1; i < N; i) {if (nums[i - 1] > nums[i]) {swap(nums[i - 1], nums[i]);sorted false;}}N--;} }Pyt…

TinyEMU编译与使用(一)

TinyEMU编译与使用&#xff08;一&#xff09; 1 介绍2 准备工作3 编译TinyEMU3.1 安装依赖库3.2 编译 4 运行TinyEMU4.1 在线运行4.2 离线运行 5 共享目录5.1 修改root_9p-riscv64.cfg5.2 启动TinyEMU5.3 执行挂载命令 6 TinyEMU命令帮助 1 介绍 原名为riscvemu&#xff0c;于…

OpenHarmony下musl编译工具链普法

OpenHarmony下musl编译工具链普法 引言 欠的债总是要还的&#xff0c;这不前面欠的关于OpenHarmony下musl相关的还是要还的。这里我对其中的相关知识点&#xff0c;梳理&#xff0c;归纳重新消化下&#xff01; 一.GCC/Clang/LLVM的区别与联系 说实话&#xff0c;这块我现在都…

基于springboot的月度员工绩效考核管理系统论文

摘 要 科学时代的发展改变了人类的生活&#xff0c;促使网络与计算机技术深入人类的各个角落&#xff0c;得以普及到人类的具体生活中&#xff0c;为人类的时代文明掀开新的篇章。本系统为月度员工绩效考核管理系统&#xff0c;是专为企业开发的对员工考核的协助软件。可以帮助…

video视频播放

1.列表页面 <template><div><ul><li class"item" v-for"(item,index) in list" :key"index" click"turnPlay(item.videoUrl)"><img :src"item.img" alt""><div class"btn…

教资截流,值得一做的项目

从去年9月份开始&#xff0c;教资这个类目基本上就成熟了&#xff0c;所以截流就出来了。 有流量的地方&#xff0c;就有截流。 12月教资截流&#xff0c;值得一做的项目 截流万变不离其宗&#xff0c;就是去别人有流量的文章或者视频下面截流。 我记得今年7月的时候&#xff…

K线实战分析系列之二十一:三星形态——罕见的反转信号

K线实战分析系列之二十一&#xff1a;三星形态——罕见的反转信号 一、三星形态二、三星形态总结 一、三星形态 二、三星形态总结 三星形态由三根十字线组成&#xff0c;是反转信号&#xff0c;在行情阶段性的顶部或者是底部出现典型的三星形态中间的十字线收盘价高于前一根和…
最新文章