再談JavaScript閉包及應用

来源:http://www.cnblogs.com/tdws/archive/2016/10/09/5944254.html
-Advertisement-
Play Games

寫在前面 本文章版權歸博客園和作者共同所有,轉載請註明原文地址博客園吳雙 http://www.cnblogs.com/tdws/ 閉包真的是學過一遍又一遍,Js博大精深,每次學習都感覺有新的收穫。相信在大家封裝前端插件時,閉包是必不可少的。閉包的真正好處我個人認為除了封裝還是封裝,能帶個我們私有方 ...


寫在前面

本文章版權歸博客園和作者共同所有,轉載請註明原文地址博客園吳雙 http://www.cnblogs.com/tdws/

閉包真的是學過一遍又一遍,Js博大精深,每次學習都感覺有新的收穫。相信在大家封裝前端插件時,閉包是必不可少的。閉包的真正好處我個人認為除了封裝還是封裝,能帶個我們私有方法,和調用上的靈活方便,也會使你的代碼對外的對象保持乾凈整潔。

進入正題

維基百科這樣定義了JS閉包:在電腦科學中,閉包英語:Closure),又稱詞法閉包Lexical Closure)或函數閉包function closures),是引用了自由變數的函數。這個被引用的自由變數將和這個函數一同存在,即使已經離開了創造它的環境也不例外。所以,有另一種說法認為閉包是由函數和與其相關的引用環境組合而成的實體。閉包在運行時可以有多個實例,不同的引用環境和相同的函數組合可以產生不同的實例。

通俗的講,閉包不同於一般函數,它允許一個函數在立即此法調用的作用域外,仍可訪問非本地變數。我還想說,閉包的語法讓你的代碼更加動感,下麵的一段代碼可能會讓你有所感觸。

<script>
        (function () {
            var userToken = "this is my token";
            var someConfig = "opening some function";
            var privateValue = "private";
            var publicValue = "public";
            var appObj = {};

            function myPrivateFunc() {
                alert(privateValue)
            }

            appObj.getUserToken = function () {
                //some logic
                userToken += " after some inner logic";
                return userToken;
            }

            appObj.publicVal = publicValue;

            window.application = appObj;
        }());//立即執行

        console.log(application.getUserToken());//this is my token after some inner logic
        console.log(application.publicVal);//public
        console.log(application.privateValue); //undefined
        application.myPrivateFunc(); //error

    </script>

我將appObj附加到window下麵,我通常喜歡定義一個全局的名為application的對象,代表著整個應用公用的頂級對象,你可以在其中向外暴露很多公共的操作方法,也可以在其中做一些私有的處理,以防外部調用導致某些問題。在所定義的“頂級”application對象下,你也可以將你所非要不可的全局變數定義在其中,這樣以防普通全局變數對應用造成的影響,又可以在你定義的閉包內,通過向外暴露的對象表達更明確的信息,我一直認為,隨隨便便定義一個JS全局變數實在是太可恥了。

閉包的寫法加上VS強大的智能提示,你會感覺到無比的暢快。下麵我又附加了一個方法

         (function () {
            var baseUrl = "www.cnblogs.com/tdws/";

            application.getBaseUrl = function () {
                return baseUrl;
            }
        }());

        console.log(application.getBaseUrl());//www.cnblogs.com/tdws/

 

寫在最後

你不覺得把變數保留起來,暴露出一系列get方法,很動感嗎 ╮(╯-╰)╭ 攤手......

當然閉包也需要你恰當的使用,不要造成迴圈引用,因為它將導致記憶體泄漏。不要做無謂的閉包,造成你空間的浪費,因為閉包不會被釋放。不要處處閉包,因為它將增加你代碼的複雜性。

 

如果你覺得我的點滴分享,對你有點滴幫助,歡迎點擊下方紅色按鈕關註,我將持續分享。也歡迎點下推薦,為我,也你自己點贊。

 


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

-Advertisement-
Play Games
更多相關文章
  • 今天第一次遇到const定義的變數,查閱了相關資料整理了這篇文章。主要內容是:js中三種定義變數的方式const, var, let的區別。 1.const定義的變數不可以修改,而且必須初始化。 2.var定義的變數可以修改,如果不初始化會輸出undefined,不會報錯。 3.let是塊級作用域, ...
  • 本文講述 padding / border 的設置後是否對 width 有影響,width 等於 auto 與 100% 的區別 CSS 框模型 (Box Model) 規定了元素框處理元素內容、內邊距、邊框 和 外邊距 的方式。 概述 那麼 css 屬性中width = ?呢 在標準的w3c的規定 ...
  • 用 或者 來監控文件的改變,當文件改變時,就自動刷新瀏覽器。 用 來實時編譯scss文件。 用 來非同步執行npm script命令。 先安裝上述的node工具 npm install browser sync 一、首先新建npm的 一般有如下的結構和選項 { "name": "about", "ve ...
  • 1.介紹 http-server 是一個簡單的零配置命令行HTTP伺服器, 基於 nodeJs. 如果你不想重覆的寫 nodeJs 的 web-server.js, 則可以使用這個. 2.安裝 安裝成功如下: 3.使用 在站點目錄下開啟命令行輸入 http-server 運行結果如圖: 在瀏覽器輸入 ...
  • 最近需要做一個zTree+EasyUi的許可權管理系統,以前有過接觸,在做這一塊時,用到了ztree,樹來載入咱們的菜單欄,後臺獲取登錄用戶信息的許可權列表,轉換成json對象來載入到咱們的樹當中,代碼如下: 你會發現人家早就想到了這一點,來實現這個效果,那麼, 我們就可以運用到自己的ztree當中了, ...
  • 一、簡介 這個例子是根據一個真實app的一個頁面的需求來實現的demo,通過動態add ui的方式,動態bind數據構建一個完整的課程表示例。示例並不完善,但是可以給大家一個啟發。 二、效果圖 三、相關下載 https://github.com/do-project/code4do/tree/mas ...
  • JavaScript 中一些概念理解 :clientX、clientY、offsetX、offsetY、screenX、screenY ...
  • 導航條對於每一個Web前端攻城獅來說並不陌生,但是毛玻璃可能會相對陌生一些。簡單的說,毛玻璃其實就是讓圖片或者背景使用相應的方法進行模糊處理。這種效果對用戶來說是十分具有視覺衝擊力的。 本次分享的主題:通過CSS3來製作類似下麵的導航條和毛玻璃效果。 導航條是梯形形狀的。 背景區域的毛玻璃效果。 把 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...