当前位置: 首页 > java >正文

力扣 30 天 JavaScript 挑战 第38天 (第九题)学习了 语句表达式的区别 高级函数 promise async await 节流

在这里插入图片描述

开始答题

版本一:

/*** @param {Function} fn* @return {Function}*/
var once = function(fn) {let runCount=0return function(...args){runCount++runCount == 1 ? return fn(...args) :return undefined}
};/*** let fn = (a,b,c) => (a + b + c)* let onceFn = once(fn)** onceFn(1,2,3); // 6* onceFn(2,3,6); // returns undefined without calling fn*/

报错
在这里插入图片描述
为ai为啥报错 ai说三木运算符? :后面只能写表达式不能写语句。return ?是语句。

语句与表达式的区别

语句是一个动作,不一定有事。表达式一定会得到一个值。
语句:

if (x > 10) { … } // if 语句
while (true) { … } // while 语句
return 5; // return 语句
var a = 1; // 变量声明语句

表达式:

3 + 4 // 表达式,结果是 7
x > 10 // 表达式,结果是 true 或 false
fn(1, 2) // 表达式,结果是函数返回值
a = 5 // 赋值表达式,结果是 5

即是表达式又是语句

a = 5; // 既是语句(赋值语句),又是表达式(返回 5)

第二版

/*** @param {Function} fn* @return {Function}*/
var once = function(fn) {let runCount=0return function(...args){runCount++return runCount == 1 ?  fn(...args) : undefined}
};/*** let fn = (a,b,c) => (a + b + c)* let onceFn = once(fn)** onceFn(1,2,3); // 6* onceFn(2,3,6); // returns undefined without calling fn*/

提交通过了

看官方题解

知识点

  1. 高阶函数
    在 JavaScript(以及很多语言)里,如果一个函数满足下面任意条件之一,就叫高阶函数:
  • 函数作为参数传入(参数是函数)
  • 函数作为返回值返回(返回函数)

换句话说:操作函数的函数 → 就是高阶函数

  1. 异步操作 promise 与 async await
  • 它俩都是处理异步操作的,async 是promise的语法糖,通过async可以像处理同步那样处理异步。
  • Promise 的基本语法
const p = new Promise((resolve, reject) => {// 做一些异步的事...// 成功时调用 resolve(值)// 失败时调用 reject(错误)
});

new Promise(…) 创建一个 Promise 对象
里面必须传一个函数,这个函数有两个参数:resolve 和 reject
resolve(value) → 表示成功,并把结果 value 传出去
reject(error) → 表示失败,并把错误传出去
then ,catch 注是 Promise 对象的方法
then作用是:当 Promise 完成后(resolve),执行的回调函数,then里面会自动接收resolve里面传入的参数。可以使用多个then把异步操作顺序串联,上一个 then 的返回值作为下一个 then 的输入
catch作用是:处理 Promise 失败(reject)或者 then 中抛出的异常。

  • 实例对比
//promise
const p1 = new Promise(resolve => setTimeout(() => resolve("A"), 1000));p1.then(console.log); // 1秒后输出 "A"
//async
const p1 = new Promise(resolve => setTimeout(() => resolve("A"), 1000));async function run() {const result = await p1; // 等待 p1 完成,拿到值console.log(result);     // 输出 "A"
}run();
  1. 在原函数外面再包一层函数来修改或扩展函数
  • 节流:限制执行频率
function throttle(fn,delay){let lastTime =0 return function(...args){const now = Date.now()if(now - lastTime > delay){fn(args)lastTime = now}}
}
// 用法:搜索时 500ms 内只发一次请求
const search = (text) => console.log("查询数据库:", text);
const throttledSearch = throttle(search, 500);// 模拟用户频繁输入
throttledSearch("a");
throttledSearch("ab");
throttledSearch("abc");
// 最终只会间隔 >= 500ms 时才真的调用一次 search
  • 时间限制:如果某一个函数执行了好久还没成功,给出失败提示。

function withTimeout(fn, ms) {return function() {return Promise.race([fn(), // 原函数new Promise((_, reject) => setTimeout(() => reject("超时"), ms))]);};
}// 模拟一个耗时很长的异步任务
const longTask = () => new Promise(resolve => setTimeout(() => resolve("完成"), 3000));const safeTask = withTimeout(longTask, 1000);safeTask().then(console.log).catch(console.error); 
// 1 秒后报 "超时",不会卡住
  • 记忆化 (Memoization): 有些函数计算量大,但输入相同 → 结果其实一样。下次相同输入就直接返回缓存。
function memoize(fn) {const cache = {};return function(...args) {const key = JSON.stringify(args);if (cache[key] !== undefined) {return cache[key]; // 从缓存取结果}const result = fn(...args);cache[key] = result;return result;};
}const slowSquare = (n) => {console.log("计算中...");return n * n;
};const fastSquare = memoize(slowSquare);console.log(fastSquare(5)); // "计算中..." 然后 25
console.log(fastSquare(5)); // 直接用缓存 → 25
http://www.xdnf.cn/news/18589.html

相关文章:

  • 《P3623 [APIO2008] 免费道路》
  • Redis Set 类型详解:从基础命令到实战应用
  • git实战(8)git高阶命令分析【结合使用场景】
  • 本地Docker部署开源Web相册图库Piwigo与在线远程访问实战方案
  • 如何优雅解决 OpenCV 分段错误(Segfault):子进程隔离实战
  • pig框架导入总结
  • 动手学深度学习(pytorch版):第六章节—卷积神经网络(1)从全连接层到卷积
  • 新能源汽车热管理仿真:蒙特卡洛助力神经网络训练
  • Text2SQL、ChatBI简介
  • [Vid-LLM] 功能分类体系 | 视频如何被“观看“ | LLM的主要作用
  • Flink2.0学习笔记:使用HikariCP 自定义sink实现数据库连接池化
  • 一键部署开源 Coze Studio
  • 第三阶段数据库-9:循环,编号,游标,分页
  • 字节跳动开源Seed-OSS:36B参数模型以512K上下文与可控思考预算重新定义AI实用主义
  • [激光原理与应用-320]:结构设计 - Solidworks - 软件工具UI组织的核心概念
  • 解决散点图绘制算法单一导致的数据异常问题
  • STM32窗口看门狗(WWDG)深度解析:精准守护嵌入式系统的实时性
  • python学习DAY49打卡
  • SHAP分析+KOA-RIME开普勒结合霜冰算法双重优化BP神经网络+9种映射方法+新数据预测!机器学习可解释分析!
  • 【升级版】从零到一训练一个 0.6B 的 MoE 大语言模型
  • 云原生俱乐部-k8s知识点归纳(8)
  • day40-tomcat
  • k8s之 Pod 资源管理与 QoS
  • Angular初学者入门第三课——工厂函数(精品)
  • 日志搜索系统前端页面(暂无后端功能)
  • webrtc弱网-SendSideBandwidthEstimation类源码分析与算法原理
  • 手机横屏适配方案
  • 20250823给荣品RD-RK3588开发板刷Rockchip原厂的Buildroot【linux-5.10】时调通AP6275P的WIFI【源码部分】
  • ArkTS 语言全方位解析:鸿蒙生态开发新选择
  • 【AI基础:神经网络】17、神经网络基石:从MP神经元到感知器全解析 - 原理、代码、异或困境与突破