1.閉包(closure) : 閉包的目的是 讀取 其餘函數內部變量,因爲正常函數執行後都會進行彈棧,從而再也不保存臨時變量,所以閉包 會使函數的臨時變量永久的保存在內存中。javascript
定義一個函數,函數內容執行過程,會把函數中變量放在堆內存,或棧內存中,一旦整個函數執行結束,棧內存彈出,堆內存等待垃圾回收,執行後沒法訪問臨時變量,而閉包能夠訪問臨時變量,java
2.經過內部函數才能訪問函數的變量,所以全部閉包的實現方式都是經過內部函數的方式實現。閉包
目的:讀取當前函數在執行過程當中的臨時變量的值函數
3.閉包會致使函數執行過程當中內存不會釋放,要注意使用場景與頻繁程度。spa
獲取函數臨時變量的值code
1. 用返回 return對象
<script> function fun(){ var obj = { name :"zhangsan" } return obj; } var a = fun(); console.log(a); </script>
2. 定義一個全局函數ip
function fun(){ var obj = { name :"zhangsan" }; //此時inner至關於全局函數,至關於在window裏面加了一個inner屬性, //inner屬性對應的值爲 function, 返回當前臨時變量obj inner = function (){ return obj; } }; //fun() //第一步要先調用 fun() fun(); //已經加載 全局函數 inner()到 window環境; var ob =inner(); console.log(ob.name);
經過在函數體內設置一個 全局function 獲取函數內臨時變量的值---全局變量函數,對局部變量對象 obj進行了引用,js識別 obj 被佔用-----就不會彈棧,因此每次執行inner時能夠訪問,------但形成obj不彈棧--不知道何時會調用,形成內存浪費內存
3.定義一個內部函數,並返回io
function fun(){ var obj = { name :"zhangsan" }; //對於當前內部函數來講 ret有訪問內部對象的權利 function ret(){ return obj; } return ret ; // ret沒加()表明當前返回的是函數對象 }; var ret = fun(); //ret自己是一個函數 var obj = ret(); console.log(obj)
經過內部函數返回,ret()方法內訪問obj對象,
var ret = fun(); //引用了 ret因此 ret 不會出棧 var obj = ret();