千鋒教育JavaScript全套視頻教程(10天學會Js,前端javascrip

js閉包的理解
什么是閉包?
閉包(closure):是指函數與其周圍的狀態(tài)(lexical environment 詞法環(huán)境)的組合。通俗的理解是一個內部函數引用了外部函數的變量,此時外部函數就形成了一個閉包。下面就是一個簡單閉包的寫法。
function box() {
????????var a = 1
????????return function () {
??????????console.log(a);
??????????return a
????????}
??????}
??????let resFn = box()
??????resFn()
?閉包的寫法
?根據上面的簡單案列,我們對閉包已經有了初步的認識。閉包的寫法必須具有以下兩點。
1.函數嵌套體。
2.內部函數可以訪問外部函數的變量
閉包的原理
1.垃圾回收機制
??垃圾回收機制就是瀏覽器內存回收機制的一種算法。垃圾回收機制就是不停歇地查找那些不在使用的局部變量,并釋放掉它所指向的內存。最早使用的垃圾回收機制的算法是 ——引用計數器算法,因為這種算法存在缺點,容易造成內存泄漏。目前已經基本不使用了。目前使用的垃圾回收機制是——標記清除法:它標記能被全局所使用的變量。被標記的變量不會被清除。
作用域鏈
?內部函數使用變量的時候會先在自身去查找,自身沒有的話就去父級作用域去查找。
閉包的特點
1.閉包的優(yōu)點
(1)局部變量常駐內存,像全局變量一樣常駐內存,不會污染全局命名空間。
(2)產生私有變量(內部函數調用外部函數的變量,此時這個變量就會變成內部函數的私有變 量)
2.閉包的缺點
(1)使用不當的話容易造成內存泄露(解決辦法就是我們在不使用的時候手動賦值為null)。
(2)內存占用比較大,浪費內存。
經典閉包
?function fn() {
??????????let a = 1
??????????return function () {
????????????a++
????????????return a
??????????}
????????}
????????let newFn = fn()
????????console.log(newFn());
????????console.log(newFn());
????????console.log(newFn());