再談JavaScript閉包及應用

hgqf5351 8年前發布 | 5K 次閱讀 閉包 JavaScript開發 JavaScript

寫在前面

閉包真的是學過一遍又一遍,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>

</code></pre>

我將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/

</code></pre>

寫在最后

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

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

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

 

來自:http://www.cnblogs.com/tdws/p/5944254.html

 

 本文由用戶 hgqf5351 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!