JS笔记:方法两次调用,执行不同分支(公共变量,闭包,类三种方法实现)
好家伙,
当我们对一个方法进行两次调用,我们希望第一次执行A分支,第二次执行B分支,该怎么做?
这意味着在连续的两次调用中,方法的执行逻辑会交替执行不同的分支。
方法一:公共变量
let flag = 1;
function myMethod() {
if (flag === 1) {
// 执行A分支的逻辑
console.log("执行A分支");
flag = 2;
} else if (flag === 2) {
// 执行B分支的逻辑
console.log("执行B分支");
flag = 1;
}
}
// 第一次调用
myMethod(); // 输出:执行A分支
// 第二次调用
myMethod(); // 输出:执行B分支

- 优点:
- 简单直接,能直接想到
- 缺点:
- 全局变量容易被污染
- 不利于模块化和封装,容易造成代码耦合度高,难以维护和扩展。
方法二:闭包
function createMethodCaller() {
let flag = 1;
return function() {
if (flag === 1) {
// 执行A分支的逻辑
console.log("执行A分支");
flag = 2;
} else if (flag === 2) {
// 执行B分支的逻辑
console.log("执行B分支");
flag = 1;
}
};
}
const myMethod = createMethodCaller();
// 第一次调用
myMethod(); // 输出:执行A分支
// 第二次调用
myMethod(); // 输出:执行B分支

- 优点:
- 使用闭包可以隐藏变量,避免全局变量污染。
- 可以模拟私有变量,提高代码的封装性和安全性。
- 缺点:
- 闭包会增加内存消耗,可能导致内存泄漏问题。
- 对闭包的理解和使用需要一定的经验,容易出现作用域和内存管理的问题。
方法三:类
class MethodCaller {
constructor() {
this.callCount = 0;
}
callMethod() {
if (this.callCount === 0) {
// 执行A分支的逻辑
console.log("执行A分支");
this.callCount++;
} else {
// 执行B分支的逻辑
console.log("执行B分支");
this.callCount = 0;
}
}
}
const myMethodCaller = new MethodCaller();
// 第一次调用
myMethodCaller.callMethod(); // 输出:执行A分支
// 第二次调用
myMethodCaller.callMethod(); // 输出:执行B分支

- 优点:
- 类提供了面向对象的编程方式,有利于封装数据和行为,提高代码的可维护性和可读性。
- 可以通过类的实例化来管理对象状态,更好地组织和管理代码。
- 缺点:
- 不容易想到,并且引入类会增加代码的复杂度,不适用于简单的逻辑处理
JS笔记:方法两次调用,执行不同分支(公共变量,闭包,类三种方法实现)的更多相关文章
- JS变量和变量交换的三种方法
一.what 变量就是用来存储数据的容器 二.how 通过var 关键字定义一个变量 var n1; //定义变量 变量的赋值:通过赋值运算符“=” 给变量赋值. var n2=123; //定义变量 ...
- [CentOS] 环境变量设置的三种方法
在CentOS系统中添加环境变量的方法有几种,推荐第三种方法.这里以添加 TexLive 2017 的环境变量为例进行说明. 1. 修改 ~/.bash_profile 文档,在文末添加以下代码: ...
- mysql 变量赋值的三种方法
mysql中变量不用事前申明,在用的时候直接用“@变量名”使用就可以了.第一种用法:set @num=1; 或set @num:=1; //这里要使用变量来保存数据,直接使用@num变量第二种用法:s ...
- Python类三种方法,函数传参,类与实例变量(一)
1 Python的函数传递: 首先所有的变量都可以理解为内存中一个对象的'引用' a = 1 def func(a): a = 2 func(a) print(a) # 1 a = 1 def fun ...
- Linux下环境变量设置的三种方法
如想将一个路径加入到$PATH中,可以像下面这样做: 1.控制台中设置,不赞成这种方式,因为他只对当前的shell 起作用,换一个shell设置就无效了:$PATH="$PATH" ...
- go语言中获取变量类型的三种方法
package main import ( "fmt" "reflect" ) func main() { var num float64 = 3.14 // ...
- python 多线程编程之threading模块(Thread类)创建线程的三种方法
摘录 python核心编程 上节介绍的thread模块,是不支持守护线程的.当主线程退出的时候,所有的子线程都将终止,不管他们是否仍在工作. 本节开始,我们开始介绍python的另外多线程模块thre ...
- 【Cocos2d-x游戏开发】解决Cocos2d-x中文乱码的三种方法
众所周知,Cocos2d-x是一款不错的开源引擎,但是在Cocos2d-x中直接使用中文是无法正确显示的.比如下面的情况: 解决这个问题常用的有三种方法:1.通过转换为UTF-8编码来显示.2.使用i ...
- 【转载】取得系统中网卡MAC地址的三种方法
From:http://blog.csdn.net/zhangting1987/article/details/2732135 网卡地址这个概念有点混淆不清.因为实际上有两个地址,mac地址和物理地址 ...
- linux 环境变量PATH路径的三种方法
转:http://www.jb51.net/LINUXjishu/150167.html 总结:修改1.#PATH=$PATH:/etc/apache/bin 或者#vi /etc/profile ...
随机推荐
- Sysbench简单测试数据库性能
摘要 先进行了一个PG数据库的测试. Mysql数据库的测试稍后跟上. 紧接着上一篇的安装, 部分文件可能需要特定路径才可以. sysbench 测试的说明 一个参数 这里稍微说一下参数的问题 sys ...
- 华为云DTSE携手“灵康宜”构造一站式智慧健康检测云平台
本文分享自华为云社区<华为云DTSE携手"灵康宜"构造一站式智慧健康检测云平台>,作者: HuaweiCloudDeveloper. 打破传统健康监测方式桎梏--非接触 ...
- 【解决了一个小问题】terraform创建service后,如何获取VIP的值?
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 创建一个pod后,再为这个pod创建一个对应的servic ...
- # 重要-即时通讯IM开源项目OpenIM关于版本管理及v2.3.0发布计划
越来越多的客户把OpenIM用到了生产环境,由于新特性持续迭代和bug修复,会涉及到后续的升级方案,为了让大家后续从容应对,本文重点总结OpenIM对未来版本管理的思路和方案.同时,官网对于文档进行了 ...
- SqlSugar更新数据
1.根据实体对象更新 所谓按实体对象更新就是:db.Updateable(参数对象) 有参数的重载 db.Updateable(实体或者集合).ExecuteCommand() //右标题1 下面的所 ...
- 1.14 手工插入ShellCode反弹
PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如 ...
- Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--添加文本
项目地址: Pdfium.Net:https://github.com/1000374/Pdfium.Net PdfiumViewer:https://github.com/1000374/Pdfiu ...
- (python)每日代码||2024.1.27||类方法与实例方法
class test(): aaa = 111 bbb = 222 ccc = 333 @classmethod def cm(cls): cls.aaa="***" def im ...
- ElasticSearch7.3学习(十)----采用restful风格对索引的增删改查
1. 为什么需要手动创建索引 直接put数据 PUT index/_doc/1,es会自动生成索引,并建立动态映射dynamic mapping.这样的话很大可能与实际的需求不服,在实际的应用上,我们 ...
- MySQL 报错:ERROR 2002 (HY000): Can't connect to local MySQL server through socket
MySQL 报错:ERROR 2002 (HY000): Can't connect to local MySQL server through socket 一.错误现场还原: 下面我们通过三种方式 ...