閉包以及暴露介面---學習筆記

來源:互聯網
上載者:User

標籤:return   使用方法   執行   建立   筆記   div   上下文環境   for   位置   

閉包      :  函數可以訪問它被建立時所處的上下文環境。---《JavaScript語言精粹》

產生原理:  JavaScript中沒有塊級範圍,只有函數範圍,函數中任何位置定義的參數和變數在函數內的任何地方都是可見的,在函數外不可見。

使用方法:  可以通過在函數內部建立局部變數,實現變數的私人化。(外部不可見)

注意事項:  內建函式訪問外部函數的變數時訪問的是實際變數(值為外部函數返回時變數的值)。

知識點   :  ①只要內建函式需要,外部函數中的變數不會在外部函數返回後銷毀。(多了浪費記憶體)

                ②通過定義內建函式實現對內部變數資訊的查詢和修改,實現介面的暴露。

舉個例子: 

var myObject = (function(){    var value=0;    return {        getValue: function(){            return value;        },        setValue: function(v){            if (typeof v === ‘number‘){                 value = v;            }        }    };        }());    

這段代碼得到一個myObject對象,包含兩個方法,只有這兩個方法可以擷取或者修改value變數,沒有其他辦法可以訪問到value變數。
這個value變數我們叫私人變數,這兩個可以訪問私人變數的共有方法就叫做特權方法。

再舉個例子:

//構造一個函數,本義是通過內建函式返回一個函數數組,數組中每一項都是一個函數
//數組項函數會返回當前的數組索引
//但是最後每一項的函數都會得到返回10var eg2 = function(){ var i, result = new Array(); for(i=0; i<10; i += 1){ result[i] = function(){ return i; } } return result;};

為什麼最後數組中每一項的函數都會返回10呢?因為內部的匿名函數訪問的是變數i而不是函數建立時i的值,在for迴圈執行完後變數i中儲存的值為10,最後外部函數返回的result數組中的每一項的函數中返回的變數i的值也就為10。

可以修改成這樣解決:

//在for迴圈之外建立一個輔助函數,返回一個會返回傳入的值的函數var eg2 = function(){    var result = new Array();                           var helper = function(e){        return function(){            return e;        }    };    var i;    for(i=0; i<10; i += 1){        result[i] = helper(i);    }    return result;};

在for迴圈中每次調用helper()函數時,傳入變數i,由於函數參數是按值傳遞的,helper()就會將當前的變數i的值複製給局部變數e,然後返回一個會返回變數e的函數。

這裡的變數e是每個數組項函數的局部變數,各自儲存著各自不同的值。

閉包以及暴露介面---學習筆記

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.