再談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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...