1. 程式人生 > >閉包--面試之必問

閉包--面試之必問

 1.閉包是什麼?

     閉包是指有權訪問另一個函式作用域中的變數的函式。

    特性:

    ​    1.函式巢狀函式

    ​    2.函式內部可以引用外部的引數和變數

    ​    3.引數和變數不會被垃圾回收機制回收

  2.如何建立?

     在一個函式內部建立另一個函式。

     【注意】:通常,函式的作用域及其所有變數都會在函式執行結束後被銷燬

              但是當函式返回到一個閉包時,這個函式的作用域將會一直在記憶體中存在到閉包不存在為止;

   內部函式執行完成後,其活動物件不會被銷燬,因為匿名函式的作用域鏈仍然在引用這個活動物件。

即:當內部函式被返回後,其執行環境作用鏈會被銷燬,但它的活動物件仍然會留在記憶體中,直到匿名函式被銷燬後,內層函式的活動物件才會被銷燬。

1 2 3 4 5 6 //建立函式 var comparNames = createComparisonFunction("name"); //呼叫函式 var result = comparNames((name:"mimi"),(name:"haha")); //解除對匿名函式的引用(以便釋放記憶體) compareNames = null;

​ 3.閉包與變數

    閉包只能取得包含函式中任何變數的最後一個值。

1 2 3 4 5 6 7 8 9 10 function createFunctions(){ var result = new Array(); for(var i=0; i<10;i++){ result[i] == function(){ return i ; } } return result; }

      ( 結果返回10 )  

  解決辦法:建立另一個匿名函式強制讓閉包的行為達到預期。

1 2 3 4 5 6 7 8 9 10 11 function createFunctions(){ var result = new Array(); for(i=0;i<10;i++){ result[i]=function(num){