有時候,我們需要得到函數內部的局部變量,但是前面講到,正常情況下,這是辦不到的,這個時候就用到了閉包。
**閉包就是能夠讀取其他函數內部變量的函數。**創建閉包的常見方式,就是在一個函數內部創建另一個函數。
實例1:
var a = 10;
function f1(){
var b = 1000;
function f2(){
console.log(b);
}
return f2;
}
var f2 = f1();
f2()
在上面的代碼中,函數f2被包括在函數f1內部,所以,函數f2可以讀取到函數f1中的局部變量。此時f2作爲一個函數,成爲返回值,那麼f2就叫做閉包。
閉包的用處:
1.可以讀取函數內部的變量;
2.讓這些變量保存在內存中。
但是閉包也會產生很多難易解決的問題,比如:
function f1(){
var n = 999;
nAdd = function(){
n+=1;
}
function f2(){
alert(n);
}
return f2;
}
var f2 = f1();
f2();
nAdd();
f2();
如上,函數f1和f2始終在內存中,不會被垃圾回收機制回收。
故閉包的缺點有:
1. 使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包;
2. 閉包會在福函數外部,改變父函數內部的值,但是在使用的時候一定要小心。