閉包是js中的一大特色,也是一大難點(diǎn)。簡單來說,所謂閉包就是說,一個(gè)函數(shù)能夠訪問其函數(shù)外部作用域中的變量。
閉包的三大特點(diǎn)為:
1、函數(shù)嵌套函數(shù)
2、內(nèi)部函數(shù)可以訪問外部函數(shù)的變量
3、參數(shù)和變量不會(huì)被回收。
舉例來說:
function test(){
? ? var a=1;
? ? return function(){
? ? ? alert(a);
? ? }
? }
? var try=test();
? try();//彈出a的值
這個(gè)例子中,變量a在test方法外部是無法訪問的,但test方法里面,嵌套了一個(gè)匿名函數(shù),通過return返回,test作用域中的變量a,
可以在匿名函數(shù)中訪問。并且當(dāng)test方法執(zhí)行后,變量a所占內(nèi)存并不會(huì)釋放,以達(dá)到嵌套的函數(shù)還可以訪問的目的
閉包的作用在于,可以通過閉包,設(shè)計(jì)私有變量及方法。
舉例來說:在java中創(chuàng)建perosn類,含有私有變量name。
public class Person{
? ? private String name='wy';
? ? public Person(val){
? ? ? name=val;
? ? }
? ? public void setName(val){
? ? ? name=val;
? ? }
? ? public String getName(){
? ? ? return name;
? ? }
}
在js中實(shí)現(xiàn)類似java創(chuàng)建類的功能:
(function(){
? ? ? ? ? ? var name="wangyu";
? ? ? ? ? ? Person=function (val) {
? ? ? ? ? ? ? ? name=val;
? ? ? ? ? ? }
? ? ? ? ? ? Person.prototype.setName=function(val){
? ? ? ? ? ? ? ? name=val;
? ? ? ? ? ? }
? ? ? ? ? ? Person.prototype.getName=function () {
? ? ? ? ? ? ? ? return name;
? ? ? ? ? ? }
? ? ? ? })();
? ? ? var person1=new Person("sj");
? ? ? alert(this.name)//undefined 因?yàn)樵趂unction作用域外不能訪問
? ? ? alert(person1.getName());//wangyu
在function里面的name,由于是在function作用域中,所以外部無法訪問,但是可以通過創(chuàng)建person對(duì)象,調(diào)用person的方法,來達(dá)到
修改和訪問name值的目的,類似于java類中的私有變量,外部無法訪問,只能通過類方法訪問。
再看一個(gè)私有變量的例子:
var aaa = (function(){
? ? ? ? var a = 1;
? ? ? ? function bbb(){
? ? ? ? ? ? ? ? a++;
? ? ? ? ? ? ? ? alert(a);
? ? ? ? }
? ? ? ? function ccc(){
? ? ? ? ? ? ? ? a++;
? ? ? ? ? ? ? ? alert(a);
? ? ? ? }
? ? ? ? return {
? ? ? ? ? ? ? ? b:bbb,? ? ? ? ? ? //json結(jié)構(gòu)
? ? ? ? ? ? ? ? c:ccc
? ? ? ? }
? ? })();
? ? alert(aaa.a)//undefined
? ? aaa.b();? ? //2
? ? aaa.c()? ? ? //3
總結(jié):
1、閉包是指有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù),創(chuàng)建閉包的最常見的方式就是在一個(gè)函數(shù)內(nèi)創(chuàng)建另一個(gè)函數(shù),通過另一個(gè)函數(shù)訪問這個(gè)函數(shù)的局部變量。閉包的缺點(diǎn)就是常駐內(nèi)存,會(huì)增大內(nèi)存使用量,使用不當(dāng)很容易造成內(nèi)存泄露。
2、不必糾結(jié)到底怎樣才算閉包,其實(shí)你寫的每一個(gè)函數(shù)都算作閉包,即使是全局函數(shù),你訪問函數(shù)外部的全局變量時(shí),就是閉包
的體現(xiàn)。