js的作用域分兩種,全局和局部,基於我們所熟悉的作用域鏈相關知識,我們知道在js作用域環境中訪問變量的權利是由內向外的,內部作用域可以獲得當前作用域下的變量並且可以獲得當前包含當前作用域的外層作用域下的變量,反之則不能,也就是說在外層作用域下無法獲取內層作用域下的變量,同樣在不同的函數作用域中也是不能相互訪問彼此變量的,那麼我們想在一個函數內部也有限權訪問另一個函數內部的變量該怎麼辦呢?閉包就是用來解決這一需求的,閉包的本質就是在一個函數內部創建另一個函數。
函數裏面包含的子函數,子函數訪問父函數的局部變量
通過return將子函數暴露在全局作用域,子函數就形成閉包
通過閉包,父函數的局部變量沒有被銷燬,可通過閉包去調用 ,但同時,這個局部變量也不會被全局變量污染
function outFn() {
var count = 0;
function innerFn(){
return count += 1;
}
return innerFn;
}
var add = outFn();
add(); // 1
避免全局變量的污染,同時,局部變量沒有被銷燬,駐留在內存中,還可以被訪問
但
增大了內存消耗,造成內存泄漏,解決方法是可以在使用完變量後手動爲它賦值爲null;