首頁 >web前端 >js教程 >JS中閉包的涵義

JS中閉包的涵義

一个新手
一个新手原創
2017-09-11 10:34:461268瀏覽


閉包(Closure)

閉包是指有權存取另一個函數作用域中的變數的函數。

如何建立閉包

最常見的就是在一個函數內部建立另一個函數。以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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn