什么是閉包狗唉?
閉包就是函數(shù)的局部變量的集合初烘,只是這些局部變量在函數(shù)返回后會繼續(xù)存在。閉包就是函數(shù)的‘堆棧’在函數(shù)返回后并不釋放肾筐,我們也可以理解為這些函數(shù)堆棧并不在棧上分配而是在堆上分配哆料。當(dāng)在一個函數(shù)內(nèi)定義另一個函數(shù)就會產(chǎn)生閉包。
為了便于理解 ==> 閉包:是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù)吗铐。
那是什么JS中的作用域呢东亦?
JavaScript中是沒有塊級作用域的,不過關(guān)于塊級作用域此處不講唬渗,變量的作用域無非就是兩種:全局變量和局部變量典阵。! JavaScript是可以在函數(shù)內(nèi)部直接讀取全局變量的镊逝。
var n = 999
function f1 () {
alert(n);
};
f1(); // 999
如上壮啊,
f1
調(diào)用了全局變量n
另一方面,在函數(shù)外部自然無法撑蒜,讀取函數(shù)內(nèi)的局部變量歹啼。
function fun () { var = 999; }
laert(n) // error
注意: 函數(shù)內(nèi)部申明變量的時候,一定要使用var(
es6 => let
等 )座菠;如果不用狸眼,這個變量=
全局變量。
1.理解閉包浴滴。
我們已經(jīng)說了作用域拓萌,塊級作用域,那又該如何去訪問函數(shù)內(nèi)部的變量呢升略?
處于種種原因微王,我們有時候需要得到函數(shù)內(nèi)部的局部變量,但是前面已經(jīng)說過了降宅,正常情況下骂远,這是辦不到的,只有通過變通辦法才能實現(xiàn)腰根。
function f1 () {
var n = 999;
function f2 () {
alert(n);
}
return f2;
};
var result = f1(); // 此處實際是f2
result(); // 此處實際是調(diào)用f2
如上: 函數(shù)中的
f2
就是閉包激才,就是通過建立函數(shù)來訪問函數(shù)內(nèi)部的局部變量。
2.閉包用途
閉包可以用在許多地方额嘿,它的最大用處有兩個瘸恼,一個是前面提到的可以讀取函數(shù)內(nèi)部的變量,另一個就是讓這些變量的值始終保持在內(nèi)存中册养。
function f1 () {
var n = 999;
nAdd = function () {
n += 1
};
function f2 () {
alert(n);
}
return f2;
}
var result = f1();
result();//999
result();//999
這段代碼
result
實際上就是閉包函數(shù)f2
东帅,它運行了2次,都是999球拦,說明靠闭,函數(shù)f1
中的局部變量n
帐我,一直保存在內(nèi)存中,并沒有在f1
調(diào)運后被自動清除愧膀。