標籤: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是每個數組項函數的局部變數,各自儲存著各自不同的值。
閉包以及暴露介面---學習筆記