javascript 閉包問題

2021-07-16 18:33:11 字數 1592 閱讀 2949

函式的閉包:有權訪問另乙個函式作用域中的變數的函式。常見方式:在乙個函式內部建立另乙個函式。

function createcomparisonfunction(propertuname)else

};}

閉包只能取得包含函式中任何變數的最後乙個值。閉包所儲存的是整個變數物件,而不是某個特殊的值。

function createfunction();

} return result;

}var funcs = createfunction();

for (var i=0; i < funcs.length; i++)

createfunction()函式返回乙個陣列。表面上看,似乎每個函式都應該返回自己的索引值,但事實並非如此,事實上每個函式的返回值都是10.因為每個函式的作用域鏈中都包含著createfunctions()函式的活動物件,所以它們引用的都是同乙個變數i。當createfunctions()函式返回後,變數i的值就是10,此時每個函式都引用著儲存變數i的同乙個變數物件,所以每個函式返回後都是10。

建立另乙個匿名函式:

function createfunction() ;

}(i);

} return result;

}var funcs = createfunction();

for(var i = 0; i < funcs.length; i++)

在重寫了前面的createfunction()函式後,每個函式就會返回各自不同的索引值了。在這裡,我們沒有直接把閉包賦值給數值,而是定義了乙個匿名函式,並將立即執行該函式的結果賦值給陣列。這裡的匿名函式有乙個引數num,也就是最終的函式要返回的值。在呼叫每個匿名函式時,我們傳入了變數i。由於函式引數按值傳遞的,所以就會將變數i的當前值複製給引數num。而在這個匿名函式內部,有建立並返回了乙個訪問num的閉包。這樣依賴,result陣列中的每個函式都有自己num變數的乙個副本,因此就可以返回各自不同的數值了。

閉包的作用:乙個是可以讀取函式內部的變數,另乙個就是讓這些變數的值始終保持在記憶體中。

function f1() 	    

function f2()     

return f2;   

}  var result = f1();  

result(); // 9 

add();  

result(); // 10

在這段**中,result實際上就是閉包f2函式。它一共執行了兩次,第一次的值是999,第二次的值是1000。這證明了,函式f1中的區域性變數n一直儲存在記憶體中,並沒有在f1呼叫後被自動清除。由於閉包會使得函式中的變數都被儲存在記憶體中,記憶體消耗很大,所以不能濫用閉包,否則會造成網頁的效能問題,在ie中可能導致記憶體洩露。解決方法是,在退出函式之前,將不使用的區域性變數全部刪除。一般將其設定為null可以刪除。

function assignhandler();  

element=null;

}

Javascript閉包問題

一 什麼是閉包?概念 乙個函式有權訪問另乙個函式作用域內的變數,這個函式就是閉包。function funa return funb var a funa a lyn上述 中,funa中定義的變數,在funcb中可以直接訪問,funb就是乙個閉包。二 為什麼要用閉包?js中的函式類似與乙個小黑屋,它...

javascript閉包詳解

下面先看乙個例子,在不執行的情況下推測一下返回結果.function t1 return t2 var temp t1 var age 99 temp 在學習了作用域之後也許會分析結果是99,實際上是20.下面對其一一分析 在大部分語言中,t1被呼叫執行,則申請記憶體並把其區域性變數push入棧。t...

javascript閉包使用

之前看到一段 很是不能理解,然後就查詢資料並且找網路上得大牛請教,最後弄懂了這段 然後就拿出來總結一下。先來看一段 var arrtest for var i 0 i 3 i arrtest function function function console.log arrtest 0 tostr...