閉包:指的是有權訪問另乙個函式作用域中的變數的函式。常見的方法是在函式體內置立另乙個函式。
function createcomparefunction(propertyname)
else if(value1 > value2)
else return 0;
};}
其中value1和value2是內部函式的**,訪問了外部變數propertyname。能否訪問到外部的原因是在通過該函式的作用域鏈可以找到外部函式的作用域。後台的每個執行環境中都有乙個表示變數的物件——變數物件。全域性環境的變數物件始終存在,裡面包含著全部的全域性變數。而區域性環境中的環境變數,將在執行完之後銷毀。在函式建立的時候,會建立乙個預先包含全域性變數的作用域鏈。然後在建立自己的區域性變數的時候,把區域性變數新增到作用域鏈裡面。也就是說,通過作用域鏈,可以訪問到包含在作用域鏈中全部的變數物件。
在建立閉包的時候,裡面的匿名函式會把外部函式的活動物件包含在自己的作用域裡面。同時在外部函式執行完畢的時候,其活動變數不會銷毀。因為匿名函式還在引用這個活動物件。所以在使用完之後,需要手動將外部函式設定為null,解除該函式的引用。
需要注意的是,閉包儲存的是全部變數物件。因此如果多次呼叫該閉包,則他們都能改動外部變數的值。例如:
function createfunction()
return results;
}}alert(createfunctions());//10,10,10,10...
全都返回十,是因為每個函式的作用域鏈中都儲存著createfunction的活動物件,索引他們引用的都是同乙個i。當函式返回的時候,i為10,所以每個函式的內部都是10.
解決:可以在每次進入閉包之前,建立乙個i的副本,然後把副本傳給閉包。因為函式是按值傳遞,所以不會受到i的影響。
function createfunction()
}(i);
} return results;
}
匿名函式的作用域具有全域性性,所以匿名函式的this指向的是window。如果需要在閉包裡面使用this,需要在進入閉包前記錄外部函式的環境var that = this。然後再閉包內使用that。
閉包的記憶體洩漏問題:
如果閉包的作用域鏈中包含乙個html元素,那麼該元素無法被銷毀。例:
function assignhandler()
}
由於匿名函式中儲存了assignhandler的活動物件,所以只要匿名函式不銷毀,element的引用至少是1.所佔的記憶體不會被銷毀。解決方法類似於that的處理,即在匿名函式中不要直接使用element,而使用element的副本。同時在使用完之後,要手動解除引用。因為閉包包含的是全域性的活動物件,如果不手動解除,閉包還是會引用element
function assignhandler()
element = null;
}
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...
javaScript閉包理解
以下是樓主的見解,如有錯誤請幫忙矯正。以下是是乙個簡單的閉包例子 function creatfunc var myfunc creatfunc alert myfunc 變數variable是乙個閉包,閉包的生命週期一般為呼叫閉包的物件為空 null 時結束。舉乙個複雜點的例子 var singl...