Javascript进阶专题总结(函数、异步编程、设计模式)

news2024/9/17 9:12:40

函数式编程什么时候用

编程方法:函数式(js),面向对象(java,c++),命令式

函数式(工具式操作)

优点:JavaScript种函数是一等公民,便于拆分组合可扩展性好,方便tree-shaking

缺点:管理难度大,复杂逻辑难以组织,模块难以划分

function c1() {
    console.log(1);
}

推荐应用函数式编程:

  • 工具型库 工具库 loadsh underscore 项目重要的基础设置之一
  • 第三方库 造一个库(轮子) 推广出去给很多项目使用 必然会有大量不需要的方法(方便tree-shaking)

工具库组成部分

  • 一些常见的window操作 cookies 内核
  • 一些常见的数据操作
  • 一些业务面常见操作
// 纯函数方法
// window层面操作
export function setCookies() {
    
}
export function getCookies() {
    
}
// 常用数据操作
export function filtersame() {
    
}
// 业务面常见操作
// 例:经常更新token
export function updateToken() {
    
}

面向对象式(具体功能,业务逻辑)

优点:模块分明,逻辑清晰,方便组织庞大业务

缺点:不好配合tree-shaking,JavaScript对于面向对象实现不完美

function class1() {
    
}
class1.prototype.f1 = function () {
    console.log(1);
}

为什么要管理异步(异步目的)

确保执行顺序

异步作为JavaScript的特产,他一定程度上弥补了JavaScript单线程的问题。但是也带来了执行顺序的问题。

所以我们需要确保我们方法得执行按顺序来。此外有的时候我们可能不知道一个操作是同步还是异步。用一个promise绝对不会错。

做异步的一个技巧

  • 先梳理执行顺序,然后再通过异步知识安排执行
  • 回调函数promise化
// 验证
// 1.验证是否是纯数字(同步)
function testNumber() {}
// 2.请求后端,这个数字是否存在(异步)
function back() {}
// 3.请求第三方,验证是否合格(异步)
function other() {}
// 需顺序执行
testNumber();
back();
other();
// 我要做这个事情有哪些步骤,这些步骤有没有异步,
// 要完成这个操作逻辑顺序是什么,然后组织代码按顺序执行
var arr = [testNumber,back,other];
var promise = Promise.resolve();
// 依次执行数组
while(arr.length){
   promise = promise.then(arr.shift()).then(res=>{
        if(res.error) {
            break;        
        }
        return res;    
    })
}
async function run() {
    for(var i=0;i<arr.length;i++){
        var _result = await arr[i]();
        if(_result.error) {
            break;        
        }
    }
    return _resulte
}
run().then((res)=>{
    
})
// 回调函数promise化
// nodejs 回调
// 读取一个文件
// 梳理顺序:
// 1.拷贝文件夹read(创建一个readcopy文件夹)
// 2.读取readw文件夹
// 3.循环-》读取一个文件
// 4.写入readcopy
// 原生的回调函数
fs.mkdir("./readcopy", ()=>{
    fs.readdir("./read", (err, context) => {
        context.forEach((file) => {
            fs.readFile("./read/" + file, (err, context) => [
                fs.writeFile("./readcopy/" + file, context, () => {
                                    
                })            
            ])        
        })    
    })
})
// 改写chengpromise
// 先改一个
function readFilePromise(path) {
    return new Promise((resole, reject) => {
        fs.readFile(path,(err, context) => {
            if(err){
                reject(err)            
            } 
            resolve(context);       
        })    
    })
}
// 调用
readFilePromise(path).then((res) => {
    
})
// 当我们面对,需要大量的产出相似对象的时候-》工厂模式
function makePromise(fn) {
    var fn = fn;
    var handle = function (path, data) {
        return new Promise((resolve,reject) => {
           fn.call(this, path, function (err, content) {
               if(err){
                   reject(err)               
               } else {
                   if(data) {
                       resolve(data)                   
                   }else{
                       resolve(content)                   
                   }
               }
           })         
        })    
        return handle;
    }
    return handle;
}
// 使用创建工厂
var dirPromise = makePromise(fs.readdir);
var readFilePromise = makePromise(fs.readFile);
var mkdirPromise = makePromise(fs.mkdir);
var copyDir = function(res){
    res.forEach((file) => {
      readFilePromise("./read/" + file).then((res)=>{
          fs.writeFile("./readcopy/" +file,res,()=>{
                        
          })      
      })  
    })
}
Promise.resolve()
    .then(mkdirPromise.bind(this, "./readcopy"))// bind 绑定参数
    .then(dirPromise(this, "./read"))
    .then(copyDir)
    
async function run() {
    var _result = await mkdirPromise.bind(this, "./readcopy")
    var context = await dirPromise.bind(this, "./read")
    copyDir(context);
}

设计模式分析

如何梳理模块

// 炒菜-》点单 收银-》传菜 服务-》厨师 前台 服务员
// 需求-》 实现这个需求,需要做那些事-》要实现这些事情,应该设计那些模块-》去写这些模块

// 轮播图-》多种播放方式(渐显渐隐,左右切换,上下,百叶窗切换)
// 创建轮播图结构-》开始自动轮播-》播放方式算法-》控制它手动切换
// 轮播图初始化(创建轮播的结构,事件绑定) 轮播控制模块-》 轮播动画效果模块

 

轮播图整体类 :可以不用建造者模式(用个单纯的类)

播放效果mover(type): 策略模式

轮播效果模块(异步)-》(告诉第几张)轮播控制模块(观察者模式)

// 请为项目设计一个商品信息缓存器,需求描述如下:
// (1)可根据商品id判断商品是否加载过,如果加载过,直接从缓存里拿;如没有,则请求;
// (2)如果是热门商品,缓存于全局的对象里;
// 如果是非热门商品,则缓存于localStorage中;
// 全局对象和localStorage中的商品数量上限可以配置;
// (3)可主动调用api来更新某个商品的信息。

// maxNum 最多缓存商品数,可以缓存maxNum个热门商品,maxNum个非热门商品
function Goods(maxNum) {
    if(Goods.install){
      return Goods.install;
    }
    this.hotGoods = {}
    localStorage.setItem("noHotGoods", "{}");
    this.maxNum = maxNum || 50;
    Goods.install = this;
}
Goods.install = null;
Goods.prototype.get = async function(id) {
    const goodData = null
    const noHotGoods = JSON.parse(localStorage.getItem("noHotGoods"))
    if (this.hotGoods[id]) {
        return this.hotGoods[id]
    } else if (noHotGoods[id]) {
        return noHotGoods[id]
    } else {
        goodData = await getGoodAjax(id)
        this.set(id, goodData) 
        return goodData
    }
}
Goods.prototype.set = function(id, goodData) {
    /*
    if (goodData.isHot) {// 判断是否是热门商品
        const arr = Object.keys(this.hotGoods);
        if(this.maxNum === arr.length) {
        //    console.log('热门商品缓存已达上限,删除第一个商品')
           delete this.hotGoods[arr[0]]
        }
        this.hotGoods[id] = goodData
    } else {
        const noHotGoods = JSON.parse(localStorage.getItem("noHotGoods"));
        const arr2 = Object.keys(noHotGoods);
        if(this.maxNum === arr2.length) {
        //    console.log('非热门商品缓存已达上限,删除第一个商品')
           delete noHotGoods[arr2[0]]
        }
        noHotGoods[id] = goodData
        localStorage.setItem("noHotGoods", JSON.stringify(noHotGoods));
    }
    */
    let theGood = this.hotGoods;
    if (!goodData.isHot) {
        theGood = JSON.parse(localStorage.getItem("noHotGoods"));
    }
    const arr = Object.keys(theGood);
    if(this.maxNum === arr.length) delete theGood[arr[0]]
    theGood[id] = goodData
    if (goodData.isHot) {
        this.hotGoods = theGood
    } else {
        localStorage.setItem("noHotGoods", JSON.stringify(theGood));
    }
}
var shopGoods = new Goods();
// 获取id=1的商品
var good1 = shopGoods.get(1);
// 更新id=1的商品信息
good1 = shopGoods.set(getGoodAjax(1));

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

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

相关文章

【Linux系统】系统安全及应用二

开关安全控制一、开个安全控制1.1调整BIOS引导设置1.2GRUB限制1.3终端安全控制二、系统弱口令检查2.1安装JR工具三、网络端口扫描3.1NMAP端口扫描3.2NETSTAT&#xff0c;SS查看端口信息一、开个安全控制 1.1调整BIOS引导设置 将第一引导设备设为当前系统所在硬盘禁止从其他设…

1-时间复杂度分析

时间复杂度 ①what&#xff1a; 指执行当前算法所消耗的时间 ②简介结论&#xff1a; 时间复杂度由多项式T(n)中最高阶的项来决定&#xff0c;系数的影响忽略即可 例子&#xff1a; 操作数量T(n) 时间复杂度O(f(n)) 常数&#xff0c;比如 100000&#xff08;即&#xff1…

ChatGPT将批量文档翻译成中文的方法

文档翻译成中文软件是指在处理文档时&#xff0c;自动将文档中的内容翻译成中文的软件。这些软件通常采用自然语言处理技术&#xff0c;通过对待翻译文本的分词、词义分析、语法分析等多种技术处理&#xff0c;实现对文本中的单词、短语、句子等级别的翻译。 文档翻译成中文软件…

CSDN,有幸遇见 ——我的三周年创作纪念日

一生二&#xff0c;二生三&#xff0c;三生万物 三年&#xff0c;与 CSDN 的相遇相识相知—— 前两年都没写&#xff0c;一是没纪念的概念&#xff0c;二是纪念日这天每年总是清明节。 还有就是不知道有勋章&#xff08;&#xff08; Meet 遇见 那年&#xff0c;我六年级&a…

JVM 垃圾回收详解之垃圾收集算法+垃圾收集器

标记-清除算法 该算法分为“标记”和“清除”阶段&#xff1a;首先标记出所有不需要回收的对象&#xff0c;在标记完成后统一回收掉所有没有被标记的对象。 它是最基础的收集算法&#xff0c;后续的算法都是对其不足进行改进得到。 这种垃圾收集算法会带来两个明显的问题&…

Node.js—path模块

目录 1、什么是path模块2、path.resolve 拼接规范的绝对路径 常用3、path.sep 获取操作系统的路径分隔符4、 path.parse 解析路径并返回对象5、path.basename 获取路径的基础名称6、path.dirname 获取路径的目录名7、path.extname 获得路径的扩展名8、 path.join()路径拼接 1、…

Linux高性能服务器编程|阅读笔记:第2章 - IP协议详解

简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研 学习经验:扎实基础 + 多做笔…

超越ChatGPT:AgentGPT正在将自主AI带到浏览器中

你好&#xff0c;欢迎来到人工智能领域的新时代&#xff01;今天我们介绍AgentGPT&#xff0c;这是一款最前沿的基于浏览器的平台&#xff0c;旨在革新人工智能的自主性。这项开创性的技术让你能够在舒适的网络浏览器中创建、配置和部署定制化的人工智能代理&#xff0c;以实现…

又涨了?2023全国程序员薪资最新统计(文末附招聘岗位)

大家好&#xff0c;金三银四招聘季还在进行中。刚好最近看到一份 2022 国内程序员薪酬报告&#xff0c;感觉挺有意思的&#xff0c;跟大家分享一下。 在科技迅速发展的时代&#xff0c;各行业对程序员的需求持续增长&#xff0c;程序员作科技市场的“重要基石”&#xff0c;薪…

nodejs+vue 高校校园食堂餐品在线订购网

食堂作为学校的一个重要的部门&#xff0c;为学生提供了用餐的地点&#xff0c;学生可以在食堂享用丰富的餐品&#xff0c;建立一个在校订餐网站&#xff0c;帮助了学生提供一个用餐订餐的系统&#xff0c;也帮助了食堂提供了一个餐品展示的站点。 园的食堂作为一个窗口单位&a…

【nacos配置中心】源码部分解析

启动初始化 SpringApplication.prepareContext applyInitializers 回调ApplicationContextInitializer的initialize方法 getInitializers()从applicationContext获取List<ApplicationContextInitializer<?>> initializers 这个集合是通过SpringApplication的…

Node.js -- Express中间件

1.中间件的概念 1.1 什么是中间件 中间件&#xff08;Middleware&#xff09;,特指业务流程的中间处理环节。 1.2 现实中的例子 1.3 Express中间件的调用流程 当一个请求到达Express服务器中&#xff0c;可以连续调用多个中间件&#xff0c;从而对这次请求进行预处理。 1…

OpenGL入门教程之 深入理解

一、OpenGL简介 OpenGL是一种用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程规范。OpenGL包含一系列可以操作图形和图像的函数&#xff0c;但OpenGL没有实现这些函数&#xff0c;OpenGL仅规定每个函数应该如何执行以及其输出值(类似接口)&#xff0c;所以OpenGL仅是一…

Excel技能之计数求和,让你成为高手之路的机车手

Excel高手之路&#xff0c;开始学习就看到希望。 直接套用&#xff0c;秒变Excel大神。点滴积累&#xff0c;效率飞升。分享给更多的人&#xff0c;一起学习进步。告别加班&#xff0c;让同事刮目相看。 Excel函数&#xff0c;你可以不用&#xff0c;但是不能不知道&#xff…

OpenAI-ChatGPT最新官方接口《安全最佳实例》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(十)(附源码)

Safety best practices 安全最佳实践 前言Use our free Moderation API 使用我们的免费审核APIAdversarial testing 对抗性测试Human in the loop (HITL) 人在回路Prompt engineering 快速工程“Know your customer” (KYC) “了解你的客户”Constrain user input and limit ou…

【Vue3】setup的注意点及watch监视属性的六种情况

一&#xff0c;setup须知 1.1setup的执行时间 1.setup的执行时间要比beforCreate执行要早 export default {name: "Demo",beforeCreate(){console.log(beforeCreate已执行);},setup() {console.log(setup已执行);let person reactive({name: "小明",ag…

Faster RCNN系列——RPN的真值详解与损失值计算

目录 一、RPN真值详解二、RPN预测值三、损失值计算 一、RPN真值详解 RPN的真值分为类别真值和偏移量真值&#xff0c;即每一个Anchor是否对应着真实物体&#xff0c;以及每一个Anchor对应物体的真实偏移值&#xff0c;这两种真值的具体求解过程如下图所示&#xff1a; Anchor生…

【小程序云开发】不用后端也能构建完整的微信小程序

文章目录 什么是微信小程序云函数云数据库HTTP 云函数定时触发云函数总结写在最后 什么是微信小程序云函数 微信小程序云函数是通过微信小程序云开发提供的一种服务器端代码&#xff0c;用于在小程序中进行服务器端的开发和部署。 以下是一些常见的微信小程序云函数类型&#…

AI网站汇总(免费chatgpt)(70个持续增加中)

本文总结了八大类AI工具,包括:聊天AI、绘画AI、AI提示词、图像处理、实用工具、UI设计和3D设计、本地部署AI,汇总AI网站,一键收藏。 目录 一、聊天AI 二、绘画AI 三、AI提示词 四、图像处理

巡检机器人之仪表识别系统

作者主页&#xff1a;爱笑的男孩。 博客简介&#xff1a;分享机器学习、深度学习、python相关内容、日常BUG解决方法及Windows&Linux实践小技巧。 如发现文章有误&#xff0c;麻烦请指出&#xff0c;我会及时去纠正。有其他需要可以私信我或者发我邮箱:zhilong666foxmail.c…