目錄
- 閉包函式
- 變數作用域
- 閉包的概念
- 閉包的用途
- 閉包的缺點
閉包函式
變數作用域
要理解JavaScript閉包,就要先理解JavaScript的變數作用域,
變數的作用域有兩種:全域的和區域的(全域變數和區域變數)
JavaScript中,在函式內部可以直接讀取到全域變數,
var n=10
function fn(){
alert(n)
}
fn() //10
而在函式外部無法讀取到函式內部的變數,
function fn(){
var n=10;
}
fn()
alert(n) //n is not defined 函式外部無法讀取到函式內部的n
注意:函式內部使用var宣告變數的時候,這個變數是區域變數,如果不使用var,那么這個變數就是一個全域變數,
例如:
function fn(){
n=10;
}
fn()
alert(n) //10
另外,函式的引數也是區域性的,只在函式內部起作用,
在正常情況下,我們是無法得到函式內部的區域變數的,只有變通方法才可以——在函式內部再宣告一個函式,
function f1(){
var n=10;
function f2(){
alert(n)
}
}
f2函式可以得到f1函式內的所有區域變數,但是f1函式卻無法得到f2函式內部的區域變數——JavaScript語言特有的“鏈式作用域”結構,(即子物件會一級一級地向上尋找所有父物件的變數),所以,父物件的所有變數,對于子物件都是可見的,
f2函式可以獲取到父級函式f1的區域變數,那么如果把f2()函式回傳,在函式f1外部就可以訪問到f1()函式內部的變數了,
例如:
function f1(){
var n=10;
function f2(){
alert(n)
}
return f2()
}
f1() //頁面彈出10
例子中的f2()函式就是一個閉包函式,
閉包的概念
由于作用域原因,我們無法在函式外訪問函式里面定義的變數,但有事我們又有這個需求,因此就出現了閉包的概念,
閉包是指有權訪問另一個函式作用域中的變數的函式,
在上面的例子中,內部函式f2就是一個閉包函式,
在本質上,閉包就是將函式內部和函式外部連接起來的橋梁,
閉包是一種保護私有變數的機制,在函式執行時形成私有的作用域,保護里面的私有變數不受外界干擾,
閉包的用途
(1)可以讀取父級作用域函式內部的變數;
(2)讓變數的值始終保存在記憶體中(讓區域變數變成全域變數),不被垃圾回識訓制清除,
閉包的缺點
由于閉包會使函式中的變數都保存到記憶體中,垃圾回識訓制不清理,記憶體消耗很大,所以不能濫用閉包,否則可能導致記憶體泄漏,
補充:
什么是記憶體泄漏?
程式的運行都是需要記憶體的,只要對記憶體提出要求,作業系統必須供給記憶體,
當應用程式中的一些代碼變數不再需要用到記憶體時,但是沒有被作業系統或者可用記憶體池回收,就說明它發生了記憶體泄漏,
即,當已經不再需要某塊記憶體時,這塊記憶體還存在著——記憶體泄漏
解決閉包引起的記憶體泄漏的問題:
在退出函式之前,將不使用的區域變數全部洗掉,
例如:將當前變數的值設定為‘null’,當垃圾回識訓制啟動時,會自動對這些值為‘null’的變數回收,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/352239.html
標籤:其他
下一篇:開發一個全堆疊網頁的步驟
