再談JavaScript閉包及應用

寫在前面前端

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

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

進入正題

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

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

複製代碼
<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強大的智能提示,你會感受到無比的暢快。下面我又附加了一個方法this

複製代碼
         (function () {
            var baseUrl = "www.cnblogs.com/tdws/";

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

        console.log(application.getBaseUrl());//www.cnblogs.com/tdws/
複製代碼

 

寫在最後

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

固然閉包也須要你恰當的使用,不要形成循環引用,由於它將致使內存泄漏。不要作無謂的閉包,形成你空間的浪費,由於閉包不會被釋放。不要到處閉包,由於它將增長你代碼的複雜性。插件

 

若是你以爲個人點滴分享,對你有點滴幫助,歡迎點擊下方紅色按鈕關注,我將持續分享。也歡迎點下推薦,爲我,也你本身點贊。code

相關文章
相關標籤/搜索