閉包--面試之必問
阿新 • • 發佈:2019-01-06
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){
|