我想很多人面試的時候都會遇到這個問題,在最開始進入it行業(yè)的時候其實我也不懂該怎么回答,后來很多人告訴我用閉包,然后再有面試我就直接回答閉包,但其實我自己并不是太明白閉包的概念,也根本不了解它是如何來防止方法名的重復(fù),下面我就簡單講解下我所了解的。
先談?wù)勯]包的概念,其實閉包就是能夠讀取其他函數(shù)內(nèi)部局部變量的函數(shù),由于在js函數(shù)中,只有函數(shù)內(nèi)部的函數(shù)才可以讀取局部變量,因此可以把閉包簡單的理解為定義在一個函數(shù)內(nèi)部的函數(shù)。下面用一個例子簡單驗證閉包的2大主要功能。1,讀取函數(shù)內(nèi)部變量。2,讓這些變量的值始終在內(nèi)存中。
例子:
function a(){
var n = 99;
function b(){
alert(n);
n ;
//或者寫成 alert(n );
}
return b;
}
通過實例我們可以很簡單的發(fā)現(xiàn),n是a函數(shù)內(nèi)部的一個局部變量,我們在函數(shù)外部是無法讀取n的,但是在內(nèi)部函數(shù)b中卻可以讀取,這就驗證了閉包的第一個功能,讀取函數(shù)內(nèi)部變量。下面我們通過一些打印語句來驗證其第二個功能。
var c = a();
c();
c();
c();我來簡單解析下這四句話:var c = a();其實就是把b的值賦值給c,這里的b是一個方法名,很多人可能覺得這里會有錯誤,其實是沒有任何錯誤的,不信的可以自己去嘗試下。這里的b我們用alert(b)打印出來的其實就是function b(){alert(n);n ;//或者寫成 alert(n );},所以c的其實就這個整個b函數(shù)。執(zhí)行c()其實就是執(zhí)行b(),最后執(zhí)行三次c()之后我們會發(fā)現(xiàn)每一次打印出來n的值分別是99,100,101,這里其實就驗證了閉包的第二個功能。當(dāng)我們在函數(shù)外部調(diào)用一個普通的js函數(shù)時,當(dāng)調(diào)用結(jié)束后,js函數(shù)里面的局部變量的值就會被垃圾回收機制回收釋放,但在這里卻是從99變成了101,并沒有回收,這是為什么呢?原因在于a是b的父函數(shù),而b是一個全局變量,這導(dǎo)致b始終在內(nèi)存中,而b的存在依賴于a,所以導(dǎo)致a也始終在內(nèi)存中,從而導(dǎo)致n變量沒有被回收釋放。至此,閉包的兩大常用功能解析清楚。
下面接著談?wù)刯s文件重名文件:
避免多個js方法名重合的最簡單方法就是:采用類來封裝js頁碼?;A(chǔ)寫法如下“
var wdh = (function($){
var _this = {};
//定義變量
_this.a = '';
_this.b = '';
//定義方法
_this.c = function(){
}
_this.d =function(){}
return _this;
})(JQuery);
因為返回了_this,所以在其他地方調(diào)用時只需要用wdh.a wdh.c()這種即可。這樣完美的避免了重復(fù)的問題。
上面之所以講述了一些閉包的概念,是因為個人確實不理解下面我采用的這種避免方法名重復(fù)的方法到底和閉包有何聯(lián)系,如果看到有會的人希望在下面留言解析下,在此謝謝了。