JS | 動態生成函數 和 保存局部變量

動態生成函數 和?保存局部變量,適用于?閉包高階函數,存在于異步編程事件處理回調函數以及函數式編程中。


動態生成函數:運行時創建函數。

  • 閉包:創建一個可以訪問外部作用域變量的函數。

  • Function 構造函數:使用 new Function() 可以動態生成函數。

  • setTimeoutsetInterval:這些異步操作通常需要動態生成回調函數。

常見應用

  • 事件監聽器:根據事件參數動態生成回調函數。

  • 異步任務:如定時器回調、網絡請求的響應回調等。

  • 函數式編程:例如高階函數(接受函數作為參數或返回函數),用于靈活的操作數據。

示例:這里的 makeAdder 動態生成了一個新的加法函數 add5,并且 add5 是基于外部參數 a 來生成的。

function makeAdder(a) {return function(b) {return a + b;}
}let add5 = makeAdder(5);  // 動態生成一個函數
console.log(add5(10));     // 輸出 15

保存局部變量(閉包):

一個函數能夠“記住”并訪問它創建時的作用域中的局部變量,即使這個函數在外部環境中被調用。通過閉包,可以訪問函數外部的變量,從而保存局部變量的狀態

常見應用

  • 封裝數據:通過閉包,函數可以封裝私有數據,防止外部直接訪問。

  • 計數器:閉包常用來實現計數器,因為它可以保持狀態。

  • 函數工廠:返回一個定制化的函數,使用外部參數。

示例:這里 counter 是一個閉包,它記住了 count 的值并且可以不斷更新,盡管每次調用 counter() 都是在外部作用域中。

function makeCounter() {let count = 0;  // count 是一個局部變量return function() {count++;return count;  // 閉包保存了對 count 的引用}
}let counter = makeCounter();
console.log(counter()); // 輸出 1
console.log(counter()); // 輸出 2

總結:動態生成函數與保存局部變量的常見應用

  1. 動態生成函數

    • 高階函數:如 mapfilterreducesetTimeout 等。

    • 回調函數:在事件驅動編程中,動態生成回調函數處理不同的事件。

    • 構建定制化函數:根據傳入參數生成具有特定行為的函數(如工廠函數)。

  2. 保存局部變量(?閉包?

    • 封裝和私有數據:閉包可以幫助封裝數據,避免外部直接訪問或修改。

    • 保持狀態:如計數器、狀態管理器等場景。

    • 實現延遲計算:通過閉包延遲計算的結果,直到需要時再執行。

常見場景

  • 事件處理:在事件監聽器中,閉包可以訪問事件處理函數的局部變量。

  • 異步編程:如 setTimeoutfetch 等,在回調函數中使用閉包來保持狀態或參數。

  • 函數式編程:高階函數、函數組合等,通常會用到動態生成函數和閉包。

總結

  • 動態生成函數:在函數式編程中非常常見,可以靈活創建特定功能的函數,特別適用于回調、事件處理和定時器等場景。

  • 保存局部變量(閉包):閉包是 JavaScript 的一個強大特性,允許函數持久化局部變量的狀態,常用于實現私有數據封裝、計數器等功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/89555.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/89555.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/89555.shtml

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

相關文章

設計模式(七)

迭代器模式(Iterator Pattern)詳解 一、核心概念 迭代器模式提供一種方法來順序訪問一個聚合對象中的各個元素,而又不暴露該對象的內部表示。該模式將遍歷邏輯封裝在迭代器對象中,使聚合對象和遍歷邏輯分離。 核心組件&#xf…

24年OPPO秋季筆試題

257. 小歐過河 鏈接:https://kamacoder.com/problempage.php?pid1337 思路:這道題的實際需要求的就是在兩個11之間,最多能有多少個0。可以記錄在遍歷序列的時候,記錄有最多個0的1的兩個下標,最后再返回其差值。要注…

處理Lombok的一個小BUG

對于Lombok報錯的修改 一、問題描述 在使用IDEA創建spring boot項目時如果你勾選了Lombok,生成的Lombok會隨著maven的刷新而改變處理器的掃描路徑,從項目類變到自定義的處理器路徑 二、原因與解決方法 原因就是這里寫了Lombok的路徑才會導致你每次刷新都…

【Java入門到精通】(一)Java發展歷程與環境搭建指南

一、Java的發展 Java是在1991年由SUN公司的James Gosling(Java之父)及其團隊所研發的一種編程語言,第一個版本耗時18個月,最開始命名為Oak(一種橡樹)。Java現在廣泛應用于各種大型互聯網應用,其…

【RK3568+PG2L50H開發板實驗例程】Linux部分/UAR讀寫案例

本原創文章由深圳市小眼睛科技有限公司創作,版權歸本公司所有,如需轉載,需授權并注明出處(www.meyesemi.com) 1.1. 案例簡介 本案例旨在介紹如何測試開發板上的 UART 串口通信功能。 開發板支持的串口及其對應的設備節點如下表所…

Webpack 中的 Loader 和 Plugin 全面詳解

🎯 Webpack 中的 Loader 和 Plugin 全面詳解 📌 整理不易,記得收藏、點贊再加關注,后續還會更新更多實戰文檔! Webpack 是現代前端構建體系的核心工具,其中 Loader 和 Plugin 是其功能擴展的兩大支柱。它們…

主流分布式中間件及其選型

分布式架構中的中間件技術 在互聯網公司的分布式架構中,中間件是支撐系統高可用、高并發、可擴展的核心組件。這些中間件針對分布式環境下的共性問題(如通信、數據一致性、資源調度等)提供標準化解決方案,極大降低了分布式系統的…

設備需求極致緊湊的空間體驗,我們該如何解決?

在自動化集成過程,往往會碰到設備對控制系統體積有極致要求的情況,面對這樣的挑戰,如何解決? 項目背景與需求分析 在自動化集成過程,往往會碰到設備對控制系統體積有極致要求的情況,面對這樣的挑戰&#x…

Kotlin擴展函數與屬性

擴展函數和屬性是Kotlin中最具特色的功能之一,它們允許我們在不修改原有類的情況下為類添加新功能。這種設計既保持了類的封裝性,又提供了強大的擴展能力。 一、擴展函數:為現有類添加新行為 1.1 基礎擴展函數 擴展函數允許我們為任何類&am…

廚師上門做飯小程序源碼php方案

廚師上門做飯小程序源碼,開發語言后端php,前端uniapp。可二開定制 三個端:用戶端師傅端小程序,pc管理后臺。 一 用戶端 1.單點大廚:選擇廚師預約下單,查看廚師評價、廚師的套餐。 2.點套餐:選擇…

LLM大模型如何訪問MySQL業務數據庫

目錄 一、LLM大模型如何訪問MySQL業務數據庫 1.1 為什么需要SQL Agent? 1.2 什么是 create_sql_agent? 1.3 什么是SQLDatabaseToolkit? 二、SQL Agent智能體操作MySQL數據庫 三、本地啟動服務 驗證效果 四、怎么提高SQL Agent智能體的回復準確性&#xff1…

MySQL(112)如何選擇讀寫分離策略?

選擇讀寫分離策略是實施讀寫分離的關鍵一步。常見的讀寫分離策略包括簡單的讀寫分離和基于負載均衡的讀寫分離。為了實現這些策略,我們需要動態地選擇數據源。下面詳細介紹如何實現基于Spring Boot的讀寫分離,并結合代碼示例展示不同策略的實現。 讀寫分…

日志-解決Linux因target is busy無法卸載硬盤/分區的問題 - PHP持續占用分區

效果圖 寫在前面 此次遇到的問題是,php-fpm持續占用設備/mnt/disk1,強制殺死php所有進程后,依然會自動產生新的進程再次霸占分區,導致設備無法卸載umount。思路是解決誰在不停的搗亂。 步驟 核心: 掛載文件系統到指定…

Linux系統權限維持篇

Openssh后門 重新安裝自定義的openssh,達到記錄賬戶密碼,也可以采用萬能密碼連接的功能 1、登錄方式 2、登錄軟件 3、登錄機制 環境準備 yum -y install openssl openssl-devel pam-devel zlib zlib-devel yum -y install gcc gcc-c makewget http://c…

spring中maven缺少包如何重新加載,報錯java: 程序包org.springframework.web.reactive.function不存在

錯誤原因分析 java: 程序包org.springframework.web.reactive.function不存在 這個錯誤是由于 項目中缺少 Spring WebFlux 相關依賴 導致的。org.springframework.web.reactive.function 包屬于 Spring WebFlux 模塊(用于響應式 Web 開發),如…

Linux--線程池

目錄 Linux線程池 線程池的概念 線程池的優點 線程池的應用場景 線程池的實現 Linux線程池 線程池的概念 線程池是一種線程的使用模式。 其存在的主要原因就為:線程過多會帶來調度開銷,進而影響緩存局部性和整體性能。而線程池維護著多個線程&#…

mars3d (基于 Cesium 的輕量化三維地圖庫)

mars3d 是什么? Mars3D 作為基于 Cesium 的輕量化框架,正以其簡潔的 API 和強大的功能重新定義開發體驗。它不僅解決了原生 Cesium 學習曲線陡峭的問題,還通過封裝和優化實現了性能與易用性的雙重突破。無論是智慧城市、低空經濟還是軍事仿真,Mars3D 都能提供高效的三維可視…

uniapp 中使用路由導航守衛,進行登錄鑒權

前言: 在uniapp 使用中,對于登錄界面可能需要路由守衛進行方便判斷跳轉,以下有兩種方案,可以判斷用戶跳轉的時候是否是登錄狀態 方案一: 1. 可以使用插件 hh-router-guard 2. 使用 uni-simpe-route 方案二: 使用通過uni提供的攔截器實現, uni.addInterceptor 1.新建in…

Leetcode 262. 行程和用戶

1.題目基本信息 1.1.題目描述 表:Trips ----------------------- | Column Name | Type | ----------------------- | id | int | | client_id | int | | driver_id | int | | city_id | int | | status | enum | | request_at | varchar | -----------…

P1102 A-B 數對

P1102 A-B 數對 題目背景 出題是一件痛苦的事情! 相同的題目看多了也會有審美疲勞,于是我舍棄了大家所熟悉的 A+B Problem,改用 A-B 了哈哈! 題目描述 給出一串正整數數列以及一個正整數 C C C,要求計算出所有滿足 A ? B = C A - B = C A?B=C 的數對的個數(不同…