JavaScript编程基础 – 闭包(Closure)

news2024/9/9 0:15:53

JavaScript编程基础 – 闭包

JavaScript Programming Essentials - Closure

By Jackson@ML

闭包和JavaScript的作用域有关。

我们需要先理解闭包的概念。

本文简要介绍闭包函数以及环境状态,并用实例说明闭包的创建及其基本用法。希望对学习及开发有所帮助。

1. 闭包的概念

闭包 (closure) 是一个函数,以及它捆绑的周边环境状态(即词法环境,Lexical Environment)的引用的组合。
简言之,闭包的开发者可以从内部函数访问外部函数的作用域。

2. 词法环境

1) 变量和嵌套函数

我们先分析下面这段代码:

// a lexical environment sample
function initialize() {
    // create a local variable
    var name = "Jackson";
    // displayName() is an internal so-called 'closure'
    function displayName() {      
      // using a variable declared by its parent function
      console.log("Hello! Welcome Mr.", name);      
    }
    displayName();
}
initialize();

函数initialize( ) 创建了局部变量name, 和displayName() 函数,所以,在initialize()函数体形成了嵌套函数。创建初期,displayName()函数在initialize()函数内部定义,且仅在该函数体内可用。

显然,displayName()函数没有声明自己的局部变量。然而,它可以访问到外部函数的变量,因此,displayName()可以使用父函数initialize()中声明的变量name。

执行结果如下图所示:
在这里插入图片描述
运行成功!
通过运行该代码,我们发现在displayName()函数内的console.log()函数输出了变量name的值,而这个值是在其父函数中声明和初始化的。

2) 词法及词法作用域

词法(lexical) 一词指的是,词法作用域根据源代码中声明变量的位置确定该变量在何处可用

这个词法作用域的例子简要描述了分析器如何在函数嵌套的情况下解析变量名。嵌套函数可访问声明于它们外部作用域的变量。

3. 闭包

1) 返回函数

接下来,继续一个例子,代码如下:

function createFunction() {
    var name = "Jackson";
    function displayName() {
      console.log("Hello! Welcome, Mr.",name);
    }
    return displayName;
  }  
  var myFun = createFunction();
  myFun();

createFunction()函数同样内嵌了一个displayName()函数,与前一个示例类似。唯一不同的是,在于内部函数displayName()在执行之前,以return语句从外部函数返回。

执行结果如下图所示:
在这里插入图片描述
咋一看上述代码,可能觉得不确定能否直接运行成功。

在其它某些编程语言中,局部变量一旦在函数体内部声明,生命周期仅在于该函数的执行期间。

例如,createFunction()函数执行完毕后,大家可能认为变量name不再能够被访问。但事实上,代码仍按照预期执行完毕。

这就是JavaScript的特定情况。原因在于JavaScript函数形成了闭包。

2) 什么是闭包?

闭包是由函数以及声明该函数的词法环境组合而成的。该词法环境包含了这个闭包创建时作用域内的任何局部变量

本例中,myFun()函数执行createFunction()函数创建的displayName()函数实例的引用。

在这里,displayName()实例维持了对它的词法环境(也就是变量name存在于其中的环境)的引用。因此,当myFun被调用时,变量name仍然可用,它的值Jackson被传递给console.log()函数并输出到屏幕。

4. 更多的闭包示例

下面我们再看一个更加有趣的函数multiply(x),代码如下:

function multiply(x) {
    return function(y) {
        return x * y;
    };
}
var mt10 = multiply(10);
var mt20 = multiply(20);
console.log(mt10(2));
console.log(mt20(3));

在这个示例中,定义了multiply(x)函数,用来实现变量的乘积;它接受一个参数x,并返回一个新的函数;返回的函数接受一个参数y,并返回x * y的乘积的值。

从本质上看,multiply是一个函数工厂,它可以创建将指定的值和它的参数相乘求积的函数。上面的例子使用函数工厂创建了两个新的函数:一个将其参数乘以10,另一个将其参数乘以20求积。

mt10和mt20都是闭包。它们共享相同的函数定义,但是保存了各自不同的词法环境。例如,在mt10中,x为10;而在mt20中,x则为20。

执行结果如下图所示:

在这里插入图片描述

技术好文陆续推出,敬请关注。

喜欢就点赞哈!您的认可,我的动力。😊

5. 相关阅读:

  1. JavaScript编程进阶 - Return语句
  2. JavaScript编程基础 - 布尔值(Booleans)
  3. JavaScript编程基础 - 对象(Objects)
  4. JavaScript编程基础 - 函数进阶
  5. JavaScript编程基础 - 条件语句
  6. JavaScript编程基础 - 函数入门
  7. JavaScript编程基础 - 关键字Let, Const和Var的区别
  8. JavaScript编程基础 - 变量
  9. JavaScript编程基础 - 输出
  10. 用CodePen实现Javascript程序动态在线开发
  11. 用Visual Studio Code运行JavaScript程序失败的解决办法
  12. 用Visual Studio Code搭建JavaScript开发环境
  13. 在Jupyter Lab(Notebook)上安装运行Javascript应用程序
  14. Shell编程基础 - for循环
  15. 安装最新版WebStorm来开发JavaScript应用程序

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

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

相关文章

sql优化常用的几种方法

SQL优化是数据库管理和应用开发中的一个重要环节,它涉及到对SQL查询语句的改进,以提高执行效率,减少系统负载,并优化资源使用。以下是一些常用的SQL优化方法,我会尽量覆盖一些关键的点。 使用合适的数据类型 选择适…

通俗易懂的案例+代码解释AOP 切面编程

目录 1. 理解AOP2 Before2.1 controller层2.2 service层2.3 自定义注解2.4 切面 advice 3 After4 Around spring的三大核心:IOC控制反转、DI依赖注入、AOP面向切面编程 刚开始接触springboot项目,前两个使用的多,亲自使用AOP的机会并不多&…

python自动化测试如何做数据缓存 ?这个第三方包推荐给你,方便又简单!

1.数据缓存说明 数据缓存可以说也是项目开发中比不可少的一个工具 ,像我们测试的系统中 ,你都会见到像Redis一样的数据缓存库 。使用缓存数据库的好处不言而喻,那就是效率高 ,简单数据直接放在缓存中 ,存取简单方便 。…

探索Scrapy-spider:构建高效网络爬虫

Spider简介 Scrapy中的Spider是用于定义和执行数据抓取逻辑的核心组件。Spider负责从指定的网站抓取数据,并定义了如何跟踪链接、解析内容以及提取数据的规则。它允许您定制化地指定要抓取的网站、页面和所需的信息。Spider的作用是按照预定的规则爬取网页&#xf…

12.7 C++作业

自由发挥登录窗口的应用场景,实现一个登录窗口界面 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {//*******窗口相关设置********this->setWindowTitle("王者农药"); //设置窗口标题this->setWindowIcon(QIc…

OpenTiny Vue 3.12.0 发布:文档大优化!增加水印和二维码两个新组件

你好,我是 Kagol。 非常高兴跟大家宣布,2023年11月30日,OpenTiny Vue 发布了 v3.12.0 🎉。 OpenTiny 每次大版本发布,都会给大家带来一些实用的新特性,10.24 我们发布了 v3.11.0 版本,增加了富…

算法学习系列(六):高精度加法、减法、乘法、除法

目录 引言一、高精度加法1.题目描述2.代码实现3.测试 二、高精度减法1.题目描述2.代码实现3.测试 三、高精度乘法1.题目描述2.代码实现3.测试 四、高精度除法1.题目描述2.代码实现3.测试 引言 本文介绍了高精度加法、高精度减法、高精度乘法、高精度除法,这个高精度…

【Java数据结构 -- List和ArrayList与顺序表】

List和ArrayList与顺序表 一. List1.1 List介绍2.1 常见接口介绍3.1 List的使用 二. ArrayList与顺序表1.线性表2.顺序表2.1 接口的实现 3.ArrayList简介4. ArrayList使用4.1 ArrayList的构造 4.2 ArrayList常见操作4.3 ArrayList的遍历4.4 ArrayList的扩容机制5. ArrayList的具…

Python 网络爬虫(二):HTTP 基础知识

《Python入门核心技术》专栏总目录・点这里 文章目录 1. HTTP 协议简述2. HTTP 请求过程3. HTTP 的结构3.1 请求行3.2 请求头3.3 请求体3.4 状态行3.5 响应头3.6 响应体4. Cookie 状态管理5. HTTP 请求示例6. 总结<

HTML5+CSS3小实例:3D翻转Tab选项卡切换特效

实例:3D翻转Tab选项卡切换特效 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=…

【Linux】公网远程访问AMH服务器管理面板

目录 1. Linux 安装AMH 面板2. 本地访问AMH 面板3. Linux安装Cpolar4. 配置AMH面板公网地址5. 远程访问AMH面板6. 固定AMH面板公网地址 AMH 是一款基于 Linux 系统的服务器管理面板&#xff0c;它提供了一系列的功能&#xff0c;包括网站管理、FTP 管理、数据库管理、DNS 管理、…

信号完整性分析

目录 前言一、信号完整性SI1.1 信号失真1.2 串扰1.3 衰减 二、电源完整性PI2.1 地弹2.2 电源轨道塌陷 三、电磁兼容EMC3.1 电磁辐射3.2 抗干扰 前言 本篇介绍信号完整性分析的知识体系&#xff0c;以及部分分析方法。   什么是信号完整性?通俗来讲&#xff0c;信号在互连线的…

若依角色与权限字符串

文章目录 一、简介1.基于权限字段串2.基于角色 二、若依的权限控制1.介绍2.实践 一、简介 基于权限字段串和基于角色的访问控制是两种不同的权限管理模型&#xff0c;它们各自有其优点和应用场景。下面是这两种模型的基本概念&#xff1a; 1.基于权限字段串 基于权限字段串&…

基于ssm实验室课程管理系统源码和论文

idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 环境&#xff1a; jdk8 tomcat8.5 摘 要 随着科学实验规模的不断扩大&#xff0c;实验室课程数量的急剧增加&#xff0c;有关实验室课程的各种信息量也在不断成倍增长。面对庞大的信息量&#xff0c;就需要有…

SpringCloud简介和用处

Spring Cloud是一套基于Spring Boot的微服务框架&#xff0c;它旨在提供一种快速构建分布式系统的方法。它可以帮助开发人员构建具有高可用性、可扩展性和容错性的微服务&#xff0c;并通过Spring Boot的开发工具和库提供强大的支持。 一、简介 Spring Cloud是Spring家族中的一…

Spark Structured Streaming使用教程

文章目录 1、输入数据源2、输出模式3、sink输出结果4、时间窗口4.1、时间窗口4.2、时间水印&#xff08;Watermarking&#xff09; 5、使用例子 Structured Streaming是一个基于Spark SQL引擎的可扩展和容错流处理引擎&#xff0c;Spark SQL引擎将负责增量和连续地运行它&#…

2023-2024-1-高级语言程序设计-第2次月考编程题

注&#xff1a;此前已发布过的题解不再发布&#xff08;原题请在下面位置进行搜索&#xff09;。 7-1-2 排序(算法任意) 本题要求将给定的n个整数从大到小排序后输出&#xff08;可使用任意排序算法&#xff09;。 输入格式: 输入第一行给出一个不超过10的正整数n。第二行给…

WVP-RPO开源项目搭建实践

0.拉取代码 GitHub - 648540858/wvp-GB28181-pro: WEB VIDEO PLATFORM是一个基于GB28181-2016标准实现的网络视频平台&#xff0c;支持NAT穿透&#xff0c;支持海康、大华、宇视等品牌的IPC、NVR、DVR接入。支持国标级联&#xff0c;支持rtsp/rtmp等视频流转发到国标平台&…

详细解读电力DLT698.45-2017通信规约--正向有功总电能

建立连接请看这篇&#xff1a;详细解读DLT698.45-2017通信规约--预连接响应http://mp.weixin.qq.com/s?__bizMzA3NjAwMjQzMQ&mid2652026396&idx1&sna0a17f005d23136c922a7c381ddb7e75&chksm8481f30cb3f67a1a94e66db77e61fe73c22b1904fcdbb0144108e132b265e7b4…