問題?什么是js(JavaScript)的閉包原理,有什么作用?
一、定義
官方解釋:閉包是一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。
很顯然,丫的。。。。。啥啊!砸門農村人看不懂!!!
所以小編的理解是這樣的:****定義在函數中的函數,並且可在外部訪問得到。(正常情況下我們是無法訪問局部函數 的)這就有點兒類似脫了褲子放屁的意思,多此一舉,可是並非多此一舉。閉包肯定有 它的作用的。
作用:1、可以減少全局變量的對象,防止全局變量過去龐大,導致難以維護
2、防止可修改變量,因為內部的變量外部是無法訪問的,並且也不可修改的。安全
3、讀取函數內部的變量,另一個就是讓這些變量的值始終保持在內存中。
二、例子:(js代碼)
1.Javascript語言的特殊之處,就在於函數內部可以直接讀取全局變量。
var n=999;
function f1(){
alert(n);
}
f1(); // 999
2.另一方面,在函數外部自然無法讀取函數內的局部變量。
function f1(){
var n=999;
}
alert(n); // error
這里有一個地方需要注意,函數內部聲明變量的時候,一定要使用var命令。如果不用的話,你實際上聲明了一個全局變量!
function f1(){
n=999;
}
f1();
alert(n); // 999
*****如何從外部讀取局部變量?
我們有時候需要得到函數內的局部變量。但是,前面已經說過了,正常情況下,這是辦不到的,只有通過變通方法才能實現。
function f1(){
n=999;
function f2(){
alert(n); // 999
}
}
三、使用閉包的注意點
1)由於閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在IE中可能導致內存泄露。解決方法是,在退出函數之前,將不使用的局部變量全部刪除。
2)閉包會在父函數外部,改變父函數內部變量的值。所以,如果你把父函數當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內部變量當作它的私有屬性(private value),這時一定要小心,不要隨便
改變父函數內部變量的值。
