閉包的作用及優缺點

来源:https://www.cnblogs.com/ymbcc/archive/2019/09/27/11596327.html
-Advertisement-
Play Games

在面試題中,閉包應該是必問的問題吧(以下內容純屬個人理解,歡迎大家指正不足) 下麵我們就簡單的瞭解一下閉包這個東西到底是什麼 首先,我們先來講講什麼是閉包 簡單來說就是一個定義在函數內部的函數,可以讀取到其他函數內部變數的函數,本質上,閉包就是一個把函數內部和外部連接起來的橋梁 那我們讀取函數內部的 ...


在面試題中,閉包應該是必問的問題吧(以下內容純屬個人理解,歡迎大家指正不足)

下麵我們就簡單的瞭解一下閉包這個東西到底是什麼

 

首先,我們先來講講什麼是閉包

簡單來說就是一個定義在函數內部的函數,可以讀取到其他函數內部變數的函數,本質上,閉包就是一個把函數內部和外部連接起來的橋梁

 

那我們讀取函數內部的變數為什麼要用到閉包呢,或者說閉包的作用是什麼?

這就涉及到變數的生命周期問題了,函數內部定義的變數屬於局部變數,局部變數的生命周期是:當它所在的函數被調用的時候,就是開始,當調用執行一旦結束,局部變數就會被釋放,當我們需要函數內部變數時,他已經被釋放了,讀取不到了,這個時候怎麼解決?我們就要想辦法延長他的生命周期

閉包的目的也可以說就是這個,延長局部變數的生命周期,當函數執行完畢以後,局部變數不可以被記憶體釋放,然後讓外部可以訪問到這個變數

 

那我們如何判斷閉包是不是存在呢

閉包主要有以下幾個特點:

  1、函數套函數,閉包一定有嵌套函數

    這個意思從閉包的字面定義上其實就可以大概推出來,定義在函數內部的函數;

    那為什麼一定要函數套函數呢?因為需要局部變數,閉包的目的就是訪問函數內部的局部變數,如果不定義局部變數,那就達不到我們的目的——延長變數生命周期

  2、外層函數一定有局部變數,且內層函數一定操作了外層函數的這個變數

  3、外層函數一定把內層函數返回外部,使用return

    為什麼要用return返回這個內層函數呢?因為如果不返回這個內層函數,你就沒辦法使用這個閉包,返回內層函數的最終的目的就是讓外部可以訪問到這個閉包,如果外部沒辦法訪問閉包,那閉包怎麼做函數內部和外部溝通的橋梁

 

在做閉包的問題時,我們還需要註意以下兩點:

  1、外層函數被多次調用,都會創建新的作用域,也就是說內層函數操作的外層函數的局部變數之間是不會影響的

    這句話簡單來說就是我第一次調用這個外層函數,使用了內部的局部變數 p;我第二次第三次再調用這個外層函數使用變數 p的時候,會創建新的作用域,並不會對之前的調用產生什麼影響

  2、外層函數返回的內層函數被調用幾次,內層函數操作的外層函數的局部變數就會變化幾次

  上面兩點都可以通過下麵這段代碼看出來

  

 

 

 

   下麵是具體的輸出結果

 

  

 

   對前面解釋不明白的可以結合代碼和輸出結果來分析,

  第一點:每次的外層函數調用輸出結果都是互不影響的,看每次調用的第一個輸出結果都為0(這裡調用的是外層函數);

  第二點,在我【one第一次調用】【two第二次調用】【three第三次調用】的幾次輸出結果中可以看出,我每輸出一次(內層函數被調用一次),變數的值就會發生變化,自增1,我輸出幾次也就是調用了幾次,變數他就變化了幾次

  請註意上面雖然都是說調用,但是調用的函數是不同的,調用的是外層函數,變數互不影響,調用的是內層函數,那麼變數變化會根據你調用的次數變化

  這裡我也不知道大家能不能明白我到底想表達個啥

 

 

 閉包的壞處

 

  閉包使函數內部的變數不能被記憶體釋放,這些變數就會占用記憶體,記憶體消耗大,可能會導致記憶體泄露

  解決這個問題的辦法就是在不使用這些變數時,及時把不需要的局部變數全部刪除

 

 

 

 

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • NOW() 函數 NOW 函數返回當前的日期和時間。 提示:如果您在使用 Sql Server 資料庫,請使用 getdate() 函數來獲得當前的日期時間。 SQL NOW() 語法 SQL NOW() 實例 我們擁有下麵這個 "Products" 表: Prod_IdProductNameUni ...
  • 24日上午 ​ 朋友圈都在跟微信官方要國旗! 一瞬間刷了屏 後來朋友圈又變成了許願池 紛紛喊話 請給我一頓吃不胖的午餐 @微信官方 請讓我變白 @微信官方 請給我一個億 @中國人民銀行 請給我一座別墅 @萬科地產 可是喊完話並沒有出現 重點來了!!! 我的福利來了!!! 現在立即打開微信,按掃一掃下 ...
  • 版權申明: 本文原創首發於以下網站,您可以自由轉載,但必須加入完整的版權聲明 博客園MogooStudio: csdn博客MogooStudio: 使用方法 Shell代碼設置到xcode運行腳本里 在每次成功構建後版本號會改變 Shell代碼 我的聯繫方式: QQ:2161044579 郵箱:mo ...
  • 系統環境要求 Flutter因為是新出的框架,所以對系統還是有一定的要求的。 MacOS(64 bit) 磁碟空間:大於700M,如果算上Android Studio等編輯工具,儘量大於3G。 命令號工具:bash、mkdir、rm、git、curl、unzip、which、brew 這些命令在都可 ...
  • jQuery(expression, [context]) 返回值:jQuery 概述 這個函數接收一個包含 CSS 選擇器的字元串,然後用這個字元串去匹配一組元素。 jQuery 的核心功能都是通過這個函數實現的。 jQuery中的一切都基於這個函數,或者說都是在以某種方式使用這個函數。這個函數最 ...
  • 上一章節,我們介紹了Hexo的基礎搭建,搭建完大家一定發現,是英文版本的,並且頁面有點醜陋。這一章節,就來跟大家介紹Hexo的配置和主題的設置。 站點信息 上一章有跟大家提到過_config.yml這個文件,這個我們先稱之為站點全局的配置文件,後續我們說到主題的時候,也會有一個這樣的文件,暫時稱它主 ...
  • <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>簡易計算器</title> <script src="./lib/vue.js"></script> </head> <body> <div id="app">... ...
  • 1.安裝 less 和 less-loader。 命令: npm install less less-loader --save-dev 2.打開 build/webpack.base.conf.js ,在 module.exports = 的對象的 module.rules 後面 添加一段:{te ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...