JavaScript的閉包是什麼意思以及作用和應用場景

来源:http://www.cnblogs.com/duzheqiang/archive/2016/08/16/5777954.html
-Advertisement-
Play Games

JavaScript閉包 1、什麼是閉包 百度百科對於閉包的解釋是:閉包是指可以包含自由(未綁定到特定對象)變數的代碼塊;這些變數不是在這個代碼塊內或者任何全局上下文中定義的,而是在定義代碼塊的環境中定義(局部變數)。 以代碼進行闡釋: 這樣在執行完var c=a()後,變數c實際上是指向了函數b, ...


JavaScript閉包

1、什麼是閉包

  百度百科對於閉包的解釋是:閉包是指可以包含自由(未綁定到特定對象)變數的代碼塊;這些變數不是在這個代碼塊內或者任何全局上下文中定義的,而是在定義代碼塊的環境中定義(局部變數)。

以代碼進行闡釋:

function a(){  //建立函數a
    var i=0;    //定義變數i
    function b(){    //在函數a內套入函數b
        alert(++i);    //提示框,輸出i的值
    }
    return b;      //返回函數b的值
}
var c = a();    //將函數a賦給變數c
c();      //輸出c

  這樣在執行完var c=a()後,變數c實際上是指向了函數b,再執行c()後就會彈出一個視窗顯示i的值(第一次為1)。這段代碼其實就創建了一個閉包,為什麼?因為函數a外的變數c引用了函數a內的函數b,就是說:當函數a的內部函數b被函數a外的一個變數引用的時候,就創建了一個閉包。

2、閉包的作用

  以以上函數為例,閉包的作用就是在a執行完並返回後,閉包使得Javascript的垃圾回收機制GC(垃圾回收機制)不會收回a所占用的資源,因為a的內部函數b的執行需要依賴a中的變數,由於閉包的存在使得函數a返回後,a中的i始終存在,這樣每次執行c(),i都是自加1後alert出i的值。那麼我們來想象另一種情況,如果a返回的不是函數b,情況就完全不同了。因為a執行完後,b沒有被返回給a的外界,只是被a所引用,而此時a也只會被b引 用,因此函數a和b互相引用但又不被外界打擾(被外界引用),函數a和b就會被GC回收。

3、閉包的應用場景

  1. 保護函數內的變數安全。以最開始的例子為例,函數a中i只有函數b才能訪問,而無法通過其他途徑訪問到,因此保護了i的安全性。
  2. 在記憶體中維持一個變數。依然如前例,由於閉包,函數a中i的一直存在於記憶體中,因此每次執行c(),都會給i自加1。

 

由知道借鑒,互相參考,共同學習。


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

-Advertisement-
Play Games
更多相關文章
  • Atitit.atiRI 與 遠程調用的理論and 設計 1. 怎麼做到透明化遠程服務調用?1 2. 2 怎麼對消息進行編碼和解碼1 2.1. 確定消息數據結構dsl1 2.1.1. 消息里為什麼要帶有requestID?2 2.2. 序列化與反序列化 json2 3. 通信 http2 4. 發佈 ...
  • Atitit.js javascript的rpc框架選型 1. Dwr1 2. 使用AJAXRPC1 2.2. 數據類型映射表1 3. json-rpc輕量級遠程調用協議介紹及使用2 3.1. 2.3、JavaScript客戶端調用示例2 3.2. 2.4、直接GET請求進行調用2 4. atiri ...
  • Flickerplate 是個輕量級 jQuery 插件,大小僅為 12 kb。它允許用戶點擊滑鼠然後轉換內容,非常容易使用,響應式,支持觸摸設備 線上實例 使用方法 複製 複製 參數詳解 flick_position inner_width 下載 ...
  • × 目錄 [1]時鐘 [2]倒計時 [3]秒錶[4]鬧鐘 前面的話 本文屬於定時器的應用部分,分別用於實現與時間相關的四個應用,包括時鐘、倒計時、秒錶和鬧鐘。與時間相關需要用到時間和日期對象Date,詳細情況移步至此 時鐘 最簡單的時鐘製作辦法是通過正則表達式的exec()方法,將時間對象的字元串中 ...
  • 測試環境是chrome瀏覽器 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.132 Safari/537.36 css樣式 div { cursor:url('1.jpg'), ...
  • display 用來設置元素的顯示方式 display : block | none | inline | inline-block inline:指定對象為內聯元素 block:指定對象為塊元素 inline-block:指定對象為內聯塊元素 none:隱藏對象 float 控制元素是否浮動顯示 ...
  • 1.版本問題 如果你可以獲取下列元素 <input type="hidden"/> <div style="display:none">123</div> 而你使用的JQuery是高於1.3版本的,你獲取不到通過visibility:hidden樣式隱藏的元素就對了 2.解決方案 $("div"). ...
  • 下麵列了五個例子來詳細說明,這幾個例子的主要功能是:在5秒後,自動跳轉到同目錄下的hello.html(根據自己需要自行修改)文件。1) html的實現 優點:簡單缺點:Struts Tiles中無法使用 2) javascript的實現 優點:靈活,可以結合更多的其他功能缺點:受到不同瀏覽器的影響 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...