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

力扣 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.dtcms.com/a/346911.html

相关文章:

  • 三、Bpmnjs 核心组件与架构介绍
  • 深入剖析结构体内存对齐
  • 达梦数据库巡检常用SQL(一)
  • Base64 编码优化 Web 图片加载:异步响应式架构(Java 后端 + 前端全流程实现)
  • Linux问答题:分析和存储日志
  • [特殊字符] 在 Windows 新电脑上配置 GitHub SSH 的完整记录(含坑点与解决方案)
  • JUC之AQS
  • csrf漏洞学习笔记
  • C++ 20: Concepts 与Requires
  • 告别SaaS数据绑架,拥抱数据主权:XK+独立部署版跨境商城定制,为海外物流企业深度赋能
  • CentOS创建管理员用户feixue并设置密码全教程
  • 【c++进阶系列】:万字详解多态
  • 快速掌握Java非线性数据结构:树(二叉树、平衡二叉树、多路平衡树)、堆、图【算法必备】
  • STM32学习笔记19-WDG
  • linux shell测试函数
  • 百度深度学习面试:batch_size的选择问题
  • Linux总线设备驱动模型深度理解
  • 玩转Vue3高级特性:Teleport、Suspense与自定义渲染
  • 内联函数是什么以及的优点和缺点
  • ICP语序文字点选验证逆向分析(含Py纯算源码)
  • 基于SpringBoot+vue校园点餐系统
  • 【升级版】从零到一训练一个 0.6B 的 MoE 大语言模型
  • RabbitMQ面试精讲 Day 28:Docker与Kubernetes部署实践
  • JAVA核心基础篇-枚举
  • 【Linux网络编程】分布式Json-RPC框架 - 项目设计
  • Java试题-选择题(16)
  • 2025年渗透测试面试题总结-29(题目+回答)
  • 基于ResNet50的血细胞图像分类模型训练全记录
  • 2025-08-23 李沐深度学习19——长短期记忆网络LSTM
  • LeetCode 448.找到所有数组中消失的数字