JavaScript閉包是在應用中會經常使用的功能,在面試過程中也會遇到,因此對閉包做一個記錄:
一、變量的作用域
JavaScript基本變量類型: Undefined、 Null、 Boolean、 Number 和 String。這 5 種基本數據類型是按值訪問的,因爲可以操作保存在變量中的實際的值。
二、從外面讀取內部變量
正常情況下我們是得不到函數內部變量的,但是可以使用閉包。函數內部在定義一個函數
比如在一次面試中遇到的問題就是不使用全局變量,使一個函數奇數次輸出0,偶數次輸出1,當時對於閉包沒有這麼深刻的理解,現在總結一下:
function time(){
var i = 0;
function intime(){
i++;
return i%2;
}
return intime;
}
//調用賦值給一個變量 否則不起作用
var result = time();
result();
result();
result();
換個方式 閉包輸出intime();
//返回 function();
function time2(){
var j =0;
function intime2(){
j++;
return j%2;
}
return intime2();
}
var result2 = time2();
發現只輸出1,數字不會改變,發生這種情況的原因應該可用前面的變量被回收解釋。
再改變賦值的類型
//返回 function();
function time3(){
var k =0;
function intime3(){
k++;
return k%2;
}
return intime3();
}
var result3 = time3;
輸出的值依舊無變化
三、閉包的概念
較爲不專業的理解就是能夠讀取其他函數的函數就稱爲閉包,在本質上就是將內部函數與外部函數鏈接起來的函數
四、閉包的作用
1、可以讀取函數內部的局部變量;2、讓變量的值保持在內存中
五、閉包使用注意點
1、由於閉包不使用會一直保存在函數內部,因此需要在不適用時清除變量;
2、閉包會改變父函數的變量值,若將父函數當作對象(Object)來使用,閉包作爲公用方法時,不要隨意改變內部變量值。