js的作用域分兩種,全域性和區域性,基於我們所熟悉的作用域鏈相關知識,我們知道在js作用域環境中訪問變數的權利是由內向外的,內部作用域可以獲得當前作用域下的變數並且可以獲得當前包含當前作用域的外層作用域下的變數,反之則不能,也就是說在外層作用域下無法獲取內層作用域下的變數,同樣在不同的函式作用域中也是不能相互訪問彼此變數的,那麼我們想在乙個函式內部也有限權訪問另乙個函式內部的變數該怎麼辦呢?閉包就是用來解決這一需求的,閉包的本質就是在乙個函式內部建立另乙個函式。
函式裡面包含的子函式,子函式訪問父函式的區域性變數
通過return將子函式暴露在全域性作用域,子函式就形成閉包
通過閉包,父函式的區域性變數沒有被銷毀,可通過閉包去呼叫 ,但同時,這個區域性變數也不會被全域性變數汙染
function outfn()
return innerfn;
}var add = outfn();
add(); // 1
避免全域性變數的汙染,同時,區域性變數沒有被銷毀,駐留在記憶體中,還可以被訪問
但增大了記憶體消耗,造成記憶體洩漏,解決方法是可以在使用完變數後手動為它賦值為null;
關於閉包的總結
使用var宣告的變數會自動被新增到最接近的環境中,如果沒有var,就會自動被新增到全域性環境中 函式引數是按值傳值的,而不是引用 函式名實際就是對佔整個函式總體的引用,函式名加個括號就表示函式執行,這個整個函式總體加個括號也表示函式執行效果一樣 經典 實際包的作用就是為內部函式建立乙個臨時的全域性變...
前端 閉包的理解總結
一 概念區分 當看到function函式裡面巢狀function函式 就是閉包。二 應用場景 1 先說正常的不同的function函式之間可以呼叫函式本身 例如 function a function b 2個函式是平級定義,但是無法訪問函式內部的變數name。2 閉包就是,當想訪問函式內部的變數時...
重學前端之 關於閉包
剛開始學習前端的時候,學習閉包暈頭轉向,都不知道什麼是什麼,在接觸變成一段時間後發現因為自己基本功不紮實的原因導致基本概念不理解所以對閉包根本無法掌握,這篇文章以我自己的理解記錄一下學習對於閉包的學習歷程。區域性變數 可以簡單理解成函式內部申明的變數 全域性變數 可以簡單理解成最外層被申明的變數 複...