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 ...
随机推荐
- Redis labs 的安装
Install and setup This guide shows how to install Redis Enterprise Software, which includes several ...
- mysql8 CentOS7 简要安装说明
1. 卸载mariadb rpm -qa |grep mariadb |xargs yum remove -y比较简单的卸载办法. 2. 安装所有的rpm包. yum localinstall *.r ...
- MySQL新增数据,修改数据,删除数据
连接本地mysql语句 mysql -hlocalhost -uroot -proot DML-介绍 DML英文全称是:用来对数据库中表的数据记录进行 增 删 改 操作. 增加使用 insert 删除 ...
- web字体小于12px的解决办法
大家都知道,web端的字体在正常情况下,最小只能够是12px; 但是有些时候,可能需要字体小于12px 那么如何解决这个办法了 可以使用css3的缩放属性scale 如果字体的大小是10px; 那么我 ...
- 【JS 逆向百例】房天下登录接口参数逆向
声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 逆向目标 目标:房天下账号密码登录 主页:https://passpo ...
- P9110 [PA2020] Samochody dostawcze
题目简述 有 \(n\) 个点,这些点分为两种类型.第一种,点在 \((x,0)\) 的位置.这些点从 \(t_i\) 的时刻开始向北走.第二种,点在 \((0,y)\) 的位置.这些点从 \(t_i ...
- Python 解析JSON实现主机管理
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它以易于阅读和编写的文本形式表示数据.JSON 是一种独立于编程语言的数据格式,因此在不同的编程语言中都有对 ...
- 20.8 OpenSSL 套接字SSL传输文件
有了上面的基础那么传输文件的实现就变得简单了,在传输时通常我们需要打开文件,并每次读入1024个字节的数据包,通过SSL加密传输即可,此处的文件传输功能在原生套接字章节中也进行过详细讲解,此处我们还是 ...
- 10.1 C++ STL 模板适配与迭代器
STL(Standard Template Library)标准模板库提供了模板适配器和迭代器等重要概念,为开发者提供了高效.灵活和方便的编程工具.模板适配器是指一组模板类或函数,它们提供一种适配机制 ...
- 基于AQS实现自定义同步类
Mutex(互斥锁) Mutex是一个不可重入的互斥锁实现.锁资源(AQS里的state)只有两种状态:0表示未锁定,1表示锁定.下边是Mutex的核心源码: class Mutex implemen ...