首先要知道JavaScript是使用垃圾回收的語言,它會每隔一段時間就會釋放記憶體進行閑置資源回收。像函數中的局部變數,函數執行時在內部使用了變數,棧記憶體會分配空間以保存相應的值。在函數使用結束後,這個局部變數就不需要了,占用的記憶體就會被釋放。 那我們若是想要使這個變數不被清理,一直處於被使用中,那就 ...
首先要知道JavaScript是使用垃圾回收的語言,它會每隔一段時間就會釋放記憶體進行閑置資源回收。像函數中的局部變數,函數執行時在內部使用了變數,棧記憶體會分配空間以保存相應的值。在函數使用結束後,這個局部變數就不需要了,占用的記憶體就會被釋放。
那我們若是想要使這個變數不被清理,一直處於被使用中,那就得讓他一直被引用,那麼我們可以在一個函數裡面嵌入一個函數,小函數裡面引用大函數里的變數,並把這個函數返回到全局中,此刻我們便可讓它不被清理併在全局中使用它了
放代碼:
1 function big(){//大函數 2 var savevar = 10;//數據 3 function little(){//小函數 4 return savevar;//引用大函數的數據,並把數據返回出去 5 } 6 return little;//把小函數返回出去 7 } 8 var deal = big();//調用大函數,返回出來小函數 9 console.log(deal); // 返回的是little()這個小函數函數,如果要訪問到num就需要調用這個函數 10 var money = deal(); //調用小函數,返回出來小函數里操作的值 11 console.log(money) // 10,輸出
那平常使用閉包有什麼好處呢?
優點:
- 作用域空間不銷毀,所以變數也不會被銷毀,增加了變數的聲明周期
- 在函數外部可以訪問函數內部的變數
- 護私有變數,將變數定義在函數內,不會污染全局
缺點:
- 因為函數外部可以訪問函數內部的變數,導致變數和內部的函數引用關係一直存在,記憶體不能銷毀,會一直占用,使用量較大時會導致記憶體溢出