js閉包
js中的閉包問題是由函數(shù)變量的作用域引出的,全局變量和局部變量的概念和Java感覺沒有太大的區(qū)別,但是如果要在js中實(shí)現(xiàn)Java中的私有變量效果,就引出了js閉包。
全局變量
在js中全局變量是指在function外部聲明的變量,或者在function內(nèi)部沒有通過var聲明的變量;
全局變量的生命周期是全局性的,即:在整個(gè)js文件中都可以調(diào)用。
例如:
var a = 0;//全局變量
function myfunction(){
b = 0;//全局變量
//這里可以訪問a;
return a + b;
}
局部變量
在js中局部變量是指在function內(nèi)部通過var生命的變量;
局部變量的生命周期是局部性的,也就是只有在其聲明的function中才可以調(diào)用。
例如:
var a = 0;//全局變量
function myfunction(){
var b = 0;//局部變量
//這里可以訪問a
return a + b;
}
//但是在myfunction()外部不能訪問b
私有化需求
現(xiàn)在好多地方都會(huì)有計(jì)數(shù)器的需求;
通常我們可以通過定義全局變量的方式來實(shí)現(xiàn);
例如:
var count = 0;
funtion add(){
retutn ++count;
}
這樣看著是實(shí)現(xiàn)了我們想要的功能,但是這樣的話count變量是一個(gè)全局變量,所有的function都可以訪問這個(gè)變量,不安全;
但是局部變量又不能滿足我們的需求;
例如:
function add(){
var count = 0;
return ++count;
}
這樣每次的返回結(jié)果都是1,不是我們想要的;
在js中每個(gè)function都可以訪問他上一層聲明的變量,
例如:
function func1(){
var a = 0;
var b = function (){
//這里可以訪問變量a
return a++;
}
//這里調(diào)用b() 變量a會(huì)增加1;
b();
}
這樣把上邊的方法簡單修改就可以了
例如:
var b = (function (){//function A
var count = 0;
return function(){//function B
return ++count;
}
})();
//每次調(diào)用b()count就會(huì)增加1后返回
var c = b();
這樣最后變的()意思為調(diào)用了functionA,即:b依賴的不是functionA 而是functionA的返回值function B,
在需要的地方直接調(diào)用b()就可以了
這樣count就變成了只有b()能訪問到的私有變量了,這就是js中的閉包。