閉包是指有權存取另一個函數作用域中的變數的函數。
最常見的就是在一個函數內部建立另一個函數。以TrialFunction()函數為例:
function TrialFunction(property) { return function(a, b) { var a1 = a[property]; var b1 = b[property]; if (a1 < b1) { return -1; } else if (a1 > b1) { return 1; } else { return 0; } }; }
在上述程式碼中,內部函數存取了外部函數中的變數property。即使這個內部函數被回傳了,而且在其他地方被呼叫了,它人仍然可以存取property變數。
這種情況是因為,這個內部函數的作用域鏈包含了TrialFunction的作用域。
當某個函數被呼叫時,會建立一個執行環境(Execution Context)及對應的作用域鏈。隨後,使用arguments和其他命名參數的值來初始化函數的活動物件(Activity Object)。但在作用域鏈中,外部函數的活動物件始終處於第二位,外部函數的外部函數的活動物件處於第三位,最後直至作為作用域鏈的全域執行環境。
在函數執行過程中,為讀取和寫入變數的值,就需要在作用域鏈中尋找變數。
作用域鏈的這種機制導致了一個副作用,那就是閉包只能取得包含函數中任何變數的最後一個值。
例如:
function example() { var result = new Array(); for (var i = 0; i < 10; i++) { result[i] = function() { return i; } } return result; }
這個函數會回傳一個數組,一般大家會認為,每個函數都應該回傳自己的index,即[0, 1, 2, ……9];但實際上每個函數都回傳的是10。
#以上是JS中閉包的涵義的詳細內容。更多資訊請關注PHP中文網其他相關文章!