力扣 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.pswp.cn/diannao/96665.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/96665.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/96665.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

25年八月份寧德時代社招部分崗位入職Verify測評演繹數字推理SHL題型變更、題庫使用說明

開始測評前,請注意:1、挑選一個安靜的環境,選擇一臺網速正常且無任何網絡端口限制的電腦進行測評;2、移動設備無法兼容遠程監考功能,請使用配備有可正常運作的攝像頭的臺式機或筆記本電腦,建議使用最新版本的Chrome,Fi…

【KO】前端面試四

以下是剩余題目的詳細解答,結合前端知識體系和實際應用場景展開: 91. JS 放在 head 里和放在 body 里有什么區別? 對比維度 放在 <head> 放在 <body> 加載阻塞性 會阻塞頁面渲染,需等待 JS 下載/執行完成后,才繼續渲染頁面 一般放在 </body> 前,頁面渲…

[Vid-LLM] 數據集 | 基準測試

第5章&#xff1a;數據集與基準測試 在前一章中&#xff0c;我們探討了**視頻大語言模型(Vid-LLMs)**能夠執行的各種"工作"或"功能"&#xff0c;從視頻總結到充當智能代理。 我們了解了它們的構建方式和扮演的角色。 但這里有個關鍵問題&#xff1a;這些驚…

34、擴展倉儲管理系統 (跨境汽車零部件模擬) - /物流與倉儲組件/extended-warehouse-management

76個工業組件庫示例匯總 擴展倉儲管理系統 (跨境汽車零部件模擬) 概述 這是一個高級的倉儲管理系統 (WMS) 模擬組件&#xff0c;專為展示跨境汽車零部件的復雜物流場景而設計。它模擬了從海外供應商發貨&#xff0c;經過海運/空運、清關、質檢&#xff0c;到最終入庫上架&am…

nodejs koa留言板案例開發

包含功能 登錄注冊(不開放注冊只是用固定的賬號信息) 查看列表 查看詳情 發布信息 編輯信息 刪除信息 項目接口 npm init -y npm install koa --save npm istall koa-router --save (舊版本) 或者 npm install koa/router --save &#xff08;新版本&#xff09; npm instal…

4+ 圖論高級算法

強連通分量 基礎概念 強連通&#xff1a;在有向圖 GGG 中&#xff0c;如果兩個點 uuu 和 vvv 是互相可達的&#xff0c;即從 uuu 出發可以到達 vvv , 從 vvv 也可以到達 uuu , 則稱 uuu 和 vvv 是強連通的。如果 GGG 中任意兩個點都是互相可達的&#xff0c;則稱 GGG 是強連通圖…

從羅永浩訪談李想中學習現代家庭教育智慧

引言 在這個信息爆炸的時代&#xff0c;每個父母都在尋找培養孩子的最佳方式。在羅永浩與理想汽車創始人李想的深度訪談中&#xff0c;我們看到了一個成功企業家童年成長的真實樣本。李想的成長經歷為現代家庭教育提供了許多值得深思的啟示。 一、正義感與樂觀精神的種子 李想回…

AI實現超級客戶端打印 支持APP 網頁 小程序 調用本地客戶端打印

核心思路都是&#xff1a;需要一個安裝在用戶電腦上的“中間人”程序&#xff08;本地客戶端&#xff09;來接管打印任務&#xff0c;然后通過某種通信方式命令這個客戶端進行打印。下面我將分平臺詳細闡述各種實現思路、優缺點和適用場景。一、核心思路與公共組件&#xff1a;…

Java集合(Collection、Map、轉換)

? 推薦使用 ? 已過時 1. Collection Collection 是集合框架的根接口之一&#xff0c;它是所有單列集合&#xff08;如 List、Set、Queue 等&#xff09;的公共父接口。Collection 接口定義了集合的基本操作&#xff0c;比如添加、刪除、遍歷等。 Collection ├── List │ …

全國網絡安全知識競賽有哪些

全國范圍內有多種類型的網絡安全知識競賽&#xff0c;涵蓋國家級、行業級、高校、青少年和企業等多個維度。以下是主要的網絡安全知識競賽分類及詳細介紹&#xff1a;一、國家級網絡安全競賽"強網杯"全國網絡安全挑戰賽主辦單位&#xff1a;中央網信辦、河南省人民政…

系統架構設計師備考第1天——系統架構概述

一、架構本質與角色定位架構 系統的骨架 ? 核心作用&#xff1a; 決定系統的健壯性、生命周期、擴展性銜接需求與實現&#xff0c;保障早期質量 &#x1f468;&#x1f4bb; 架構師核心能力&#xff1a;能力維度具體要求技術掌控力精通基礎技術&#xff0c;洞悉局部瓶頸決策設…

c#實現鼠標mousemove事件抽稀,避免大數據阻塞網絡

這個封裝類可以獨立于具體的網絡傳輸邏輯&#xff0c;為任何需要減少鼠標移動數據量的應用提供靈敏度和數據量優化。 核心優化功能 1. 靈敏度調整 // 減少微小移動的數據發送 (2, 1) 0.5 → (1, 0) // 忽略微小移動2. 移動累積 // 累積多次小移動&#xff0c;批量發送 (1, 0) …

機器學習 [白板推導](十三)[條件隨機場]

? 17. 條件隨機場&#xff08;Conditional Random Field&#xff0c;CRF&#xff09; 17.1. 背景 機器學習分類模型中&#xff0c;有硬分類和軟分類兩種主流思想&#xff0c;其中硬分類模型有支持向量機SVM&#xff08;最大化幾何間隔&#xff09;、感知機PLA&#xff08;誤…

調味品生產過程優化中Ethernet/IP轉ProfiNet協議下施耐德 PLC 與歐姆龍 PLC 的關鍵通信協同案例

案例背景在食品飲料行業&#xff0c;生產過程的精準控制對于保證產品質量和安全至關重要。某知名食品飲料企業的生產線上&#xff0c;前處理、灌裝和包裝環節采用了基于 ProfiNet 主站的施耐德 M340 系列 PLC 進行控制&#xff0c;以確保生產過程的穩定性和精確性。而原料倉儲和…

Elasticsearch vs 單表LIKE查詢性能對比

關鍵因素影響 1、索引結構&#xff1a; .Elasticsearch使用倒排索引&#xff0c;特別適合文本搜索 .傳統數據庫即使有索引&#xff0c;對LIKE %keyword%這種模式也無法有效利用 2、查詢復雜度&#xff1a; .簡單查詢&#xff1a;ES快5-10倍 .復雜組合查詢&#xff1a;ES可能快1…

如何通過WordPress聯盟營銷獲取潛在客戶

您是否經營著一個銷售周期較長的業務&#xff1f; 那么你就會知道&#xff0c;從首次訪問者那里獲得立即銷售的機會是很少見的。 當然&#xff0c;您的潛在客戶在進行重大投資之前需要時間進行研究、比較各種方案并建立信任。這時&#xff0c;聯盟營銷線索挖掘就成為您的秘密…

git實戰(8)git高階命令分析【結合使用場景】

以下是 Git 高階命令分享&#xff0c;涵蓋高效協作、歷史重構、問題排查等場景&#xff0c;助你成為 Git 高手&#xff1a; 一、歷史重構與清理 1. 交互式變基&#xff08;改寫歷史&#xff09; git rebase -i HEAD~3 # 修改最近3次提交操作選項&#xff1a; reword&#xff1…

生成一個豎直放置的div,寬度是350px,上面是標題固定高度50px,下面是自適應高度的div,且有滾動條

<!-- 我要生成一個豎直放置的div&#xff0c;寬度是350px&#xff0c;上面是標題固定高度50px&#xff0c;下面是自適應高度的div&#xff0c;且有滾動條。 --><style>html,body{/* height:100vh; */margin:10px; padding:10px;} </style><div style"…

題解:P13754 【MX-X17-T3】Distraction_逆序對_前綴和_Ad-hoc_算法競賽C++

Beginning 這道題思維難度很大&#xff0c;有兩個難點其實都不好解決&#xff0c;但因為其代碼太過弱智所以只是綠題。 本題解詳細地分析了做題時的歷程與思路&#xff0c;所以希望大家可以仔細地完整閱讀。 Analysis 首先先大體觀察一下題目的性質&#xff1a;nnn 是排列&…

Android Studio下載gradle文件很慢的捷徑之路

小伙伴們是不是也經常遇到導入新的項目時&#xff0c;AS一直卡在gradle的下載中。下面介紹一種簡單暴力的方式來處理這個問題。 首先我們到gradle的官網下載自己想要的gradle版本。我這里以gradle7.5為例。點擊下載gradle-7.5-bin.zip的壓縮包。下載完成后無需解壓。直接到C:\U…