SAP Fiori开发中的JavaScript基础知识12 - 闭包,模块模式,回调函数

1. 前言

本文将介绍JavaScript中几个高阶的知识点:闭包,模块和回调。

2. 闭包

在JavaScript中,闭包是一个非常强大的特性,它允许函数记住并访问它的词法作用域,即使它在词法作用域之外执行

简单来说,当你在一个函数内部定义另一个函数时,内部的函数会记住外部函数的环境。即使外部函数已经完成了执行,内部函数仍然可以访问和操作外部函数的变量。这就是闭包。

代码示例:

function outerFunction() {var count = 0;function innerFunction() {count++;console.log(count);}return innerFunction;
}var counter = outerFunction();
counter(); // 输出: 1
counter(); // 输出: 2

在这个例子中,outerFunction定义了一个变量count和一个函数innerFunction。innerFunction可以访问和修改count变量。即使outerFunction已经返回了innerFunction并完成了执行,innerFunction仍然可以访问count变量。

闭包在模块模式中非常有用。

3. 模块模式

3.1 概述

JavaScript 的模块模式(Module Pattern)是一种结构和组织代码的方式,它提供了一种将变量和函数封装在私有作用域中的方法,同时只暴露出需要公开的部分。这种模式可以帮助我们减少全局变量的使用,避免命名冲突,提高代码的可维护性。

模块模式通常使用立即执行函数表达式(Immediately-Invoked Function Expression,IIFE)来创建。因为IIFE 可以创建一个新的作用域,防止模块内部的变量和函数污染全局作用域。

3.2 经典模块模式

经典的模块模式通常会有如下特征:

  1. 使用立即执行函数IIFE进行封装
  2. 返回值为一个对象
  3. 返回的函数对包装的模块函数具有闭包(返回的函数能够访问包装模块函数的作用域)
  4. 调用方可以向IIFE内部传递参数(通过暴露的方法)
  5. 通过变量可以访问模块实例(若需要多实例,则直接使用函数而非IIFE)

var MyModule = (function () {let sMyName;function init(sName) {sMyName = sName;}function printUserName() {console.log(sMyName);}return{ init: init,dispalyUserName: printUserName}
})();MyModule.init("Module Pattern");
MyModule.dispalyUserName();

在这个设计中,MyModule 是一个立即执行的函数,它返回一个对象,这个对象可包含公开的变量和函数。sMyName变量和 init以及printUserName方法是私有的,只能在 myModule内部访问。返回对象中的init 和 displayUserName方法是公开的,可以在 myModule 外部访问(返回对象对封装函数具有闭包)。

3.3 简短的返回参数设计

在模块模式中,也可以考虑直接在返回的对象中声明要暴露的函数。这种方式可以让函数整体变得更加简短,但缺点在于,这些函数没办法在模块内部复用了。

var MyModule = (function () {let sMyName;return {init: function (sName) {sMyName = sName;},dispalyUserName: function () {console.log(sMyName);}}
})();MyModule.init("Module Pattern");
MyModule.dispalyUserName();

3.4 将返回参数也封装到独立的对象中

这种设计思路是对3.3设计思路的一个增强,也即将要返回的对象也声明在模块函数中,这样返回对象中所定义的函数在模块函数中也是可以复用的。

var MyModule = (function () {let sMyName;let PUBLIC_API = {init: function (sName) {sMyName = sName;},dispalyUserName: function () {console.log(sMyName);}}return PUBLIC_API;})();MyModule.init("Module Pattern");
MyModule.dispalyUserName();

4. 异步模块定义

AMD(Asynchronous Module Definition)是一个在JavaScript中用于异步加载模块的规范。它允许开发者定义模块和依赖,并且不需要等待这些模块和依赖全部加载完成后才能开始执行。这种方式可以提高代码的加载和执行效率。

AMD是经典模块模式的在依赖管理角度的一个增强。实例化的过程交由framework完成。

异步模块定义通常由第三方库提供,例如SAP UI5的库就是使用的这种方式。

AMD的主要用法是通过define函数来定义模块,require函数来加载模块。

以下是一个简单的AMD代码示例:

// 定义一个模块
define('module1', ['dependency1', 'dependency2'], function(dependency1, dependency2) {// 这里是模块的代码var module1 = function() {// 使用依赖dependency1.doSomething();dependency2.doSomething();};// 返回模块的公开接口return {module1: module1};
});// 加载一个模块
require(['module1'], function(module1) {// 这里是使用模块的代码module1.doSomething();
});

在上述代码中,define函数接收三个参数:模块的名称(可选)、模块的依赖(可选)和一个工厂函数。工厂函数接收依赖作为参数,并返回模块的公开接口。

5. 回调

在JavaScript中,回调(Callback)是一个函数,它作为参数传递给另一个函数,并在该函数完成后被调用。回调函数常用于处理异步操作,例如读取文件、获取数据等。

这是一个基本的回调函数示例:

function doHomework(subject, callback) {console.log(`Starting my ${subject} homework.`);callback();
}doHomework('math', function() { console.log('Finished my homework');} );

在这个例子中,doHomework函数接受两个参数:一个是主题subject,另一个是回调函数callback。当doHomework函数完成它的工作(打印出一条消息)后,它调用回调函数,回调函数打印出"Finished my homework"。

回调函数在处理异步操作时特别有用。异步操作是指可能不会立即完成的操作,例如读取文件、下载数据等。使用回调函数,你可以在这些操作完成后执行一些代码。

例如,以下是一个使用回调函数下载数据的例子:

function downloadData(url, callback) {// 假设我们在这里下载数据,这可能需要一些时间var data = "some data from " + url;// 当数据下载完成后,我们调用回调函数callback(data);
}// 定义回调函数
function callback(data) {console.log('I received data: ' + data);
}//调用下载数据的函数
downloadData('http://example.com', callback);

在这个例子中,downloadData函数接受一个URL和一个回调函数。它模拟下载数据,这可能需要一些时间。当数据下载完成后,它调用回调函数,并将数据作为参数传递给回调函数。回调函数接收数据,并打印出一条消息。

6. 小结

本文介绍了JavaScript中闭包,模块和回调的概念,并给出了示例代码。希望对你有帮助!

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

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

相关文章

【CVE-2023-38831】进行钓鱼攻击的研究

本文仅仅是对相关漏洞利用的学习记录,请各位合法合规食用! WinRAR是一款文件压缩器,该产品支持RAR、ZIP等格式文件的压缩和解压等。WinRAR在处理压缩包内同名的文件与文件夹时代码执行漏洞,攻击者构建由恶意文件与非恶意文件构成的特制压缩包文件,诱导受…

C# wpf 嵌入外部程序

WPF Hwnd窗口互操作系列 第一章 嵌入Hwnd窗口 第二章 嵌入WinForm控件 第三章 嵌入WPF控件 第四章 嵌入外部程序(本章) 第五章 底部嵌入HwndHost 文章目录 WPF Hwnd窗口互操作系列前言一、如何实现?1、定义属性2、进程嵌入(1&…

AugmentedReality之路-平面检测(5)

本文介绍通过AR检测水平平面和垂直平面,并将检测到的平面转化为Mesh 1、在首页添加功能入口 在首页添加一个按钮,命名为Start World Track 2、自定义ExecStartAREvent 创建ARSessionConfig并取名为ARSessionConfig_World 自定义ExecStartAREvent&…

大话设计模式之迭代器模式

迭代器模式是一种行为设计模式,它允许客户端逐个访问集合中的元素,而不暴露集合的底层表示。这种模式提供了一种方法来访问聚合对象中的各个元素,而不需要暴露其内部结构。 迭代器模式由以下几个关键角色组成: 迭代器&#xff08…

React 使用 three.js 加载 gltf 3D模型 | three.js 入门

系列文章 示例项目(gitcode):https://gitcode.com/qq_41456316/simple-react-three-demo 文章目录 系列文章前言一、three.js是什么?二、使用 React 和 three.js 加载 glTF 3D 模型的步骤步骤 1:创建 React 应用步骤 2:安装 thre…

实现ElasticSearch搜索自动补全【同附Java代码实现和拼音分词器安装】

文章目录 1、简介2、拼音分词器3、自定义分词器4、自动补全查询5、实现酒店搜索框自动补全5.1、修改酒店映射结构5.2、修改HotelDoc实体5.3、重新导入5.4、自动补全查询的JavaAPI5.5、实现搜索框自动补全 6、资料分享链接 ​🍃作者介绍:双非本科大三网络…

linux:watch用法详解

文章目录 1. 描述2. 语法3. 参数4. 例子 1. 描述 watch 用于周期性地执行指定的命令,并将命令的输出打印到终端上。它可以让您以固定的时间间隔观察命令的输出,非常适合用于监视文件系统、系统状态、日志文件等。 2. 语法 watch 命令的基本语法是&…

如何手动清理Linux的内存缓存?清理buff/cache对系统有什么影响?

在Linux系统中,缓存(Cache)是用于提高文件系统性能的一种存储机制。系统会将经常访问的数据保存在缓存中,以便快速访问。手动清理Linux的缓存通常指的是清空页面缓存(page cache)和/或目录项缓存&#xff0…

linux查看网络连接数

目录 netstat top netstat 1.netstat查看当前主机上网络连接信息,端口号,pid,程序名等等 #直接查看 netstat -anp #一般使用的时候,可能要筛选 #比如8080端口是否被占用 netstat -anp | grep 8080 #minio服务占用了那些端口 netstat -anp …

unity数组

数组的定义 动态初始化:在定义数组时只指定数组的长度,由系统自动为元素赋初值的方式。 静态初始化:定义数组的同时就为数组的每个元素赋值 数组的静态初始化有两种方式 1、类型门数组名new 类型[]{元素,元素,…}; 2、类型[数组名{元素&am…

ubuntu20挂载webdav

WebDAV 是个好东西,尤其是配个自己的 NAS 使用,熟悉以后就再也离不开它啦 sudo apt-get update sudo apt-get install davfs2 上下左右键可以切换到“是”选项 2.创建目录挂载点 sudo mkdir /mnt/webdav 3.配置 davfs2 编辑 davfs2.conf 文件以配置 da…

2024.04.10嵌入式第一天

# 前言 2024年4月10号也算是有纪念意义的一天吧,什么纪念意义呢?前面博客可能也说过,本人经历过两年前端,然后因为一些不可控的原因转为java后端一年,然后前段时间因为一些原因接触了解了嵌入式这个行业,所…

Node.js 的 5 个常见服务器漏洞

Node.js 是一个强大且广泛使用的 JavaScript 运行时环境,用于构建服务器端应用程序。然而,与任何其他软件一样,Node.js 也有自己的一些漏洞,如果处理不当,可能会导致安全问题。请注意,这些漏洞并不是 Node.…

基于springboot的扶贫产品和扶贫物资捐赠系统(含源码+sql+视频导入教程+文档+PPT)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的扶贫产品和扶贫物资捐赠系统2拥有管理员和用户角色 管理员:用户管理、扶贫项目管理、物资管理、扶贫产品管理、捐赠管理、资讯管理等 用户:捐赠…

Mybites一对多collection

Goods实体属性&#xff1a; private List<GoodsImg> goodsImgList; private String id; private String name; GoodsImg实体属性&#xff1a; private String id; private String fid; private String imgpath; …

nginx+uWsgi应用部署方式

uWSGI 是一个快速的、纯C语言开发的、自维护的、对开发者友好的 WSGI 服务器&#xff0c;旨在提供专业的 Python web应用发布和开发。可使用 C/C/Objective-C 来为 uWSGI 编写插件。在这里要区分三个概念&#xff1a; WSGI&#xff1a;全称是Web Server Gateway Interface&…

90天玩转Python—16—基础知识篇:面向对象知识详解

90天玩转Python系列文章目录 90天玩转Python—01—基础知识篇:C站最全Python标准库总结 90天玩转Python--02--基础知识篇:初识Python与PyCharm 90天玩转Python—03—基础知识篇:Python和PyCharm(语言特点、学习方法、工具安装) 90天玩转Python—04—基础知识篇:Pytho…

Visual Studio C++ 正确创建项目与更改文件名

1、创建项目 1&#xff09;打开Visual Studio&#xff0c;选择创建新项目。 2&#xff09;创建空项目 3&#xff09;配置新项目&#xff0c;注意不要勾选 " 将解决方案和项目放在同一目录中 " 。并将位置的文件夹设为与解决方案同名&#xff0c;方便管理。项目名称则…

spispi

硬件部分可参考我另一篇文章 http://t.csdnimg.cn/4j3qT 接线图 这是课程的相关接线图&#xff0c;独立看门狗和窗口看门狗都适用本图 独立看门狗部分 一、配置流程 1.开启时钟 在数据手册里面有这么一段解释&#xff0c;就是说如果我们开启了看门狗&#xff0c;那么LSI就…

PTA 2813:画家问题(熄灯问题)

有一个正方形的墙&#xff0c;由NN个正方形的砖组成&#xff0c;其中一些砖是白色的&#xff0c;另外一些砖是黄色的。Bob是个画家&#xff0c;想把全部的砖都涂成黄色。但他的画笔不好使。当他用画笔涂画第(i,j)个位置的砖时&#xff0c; 位置(i−1,j)、 (i1,j)、(i,j−1)、(i…