本文是通過例項來幫助大家深刻理解js閉包,是篇非常不錯的文章,這裡推薦給大家,有需要的小夥伴可以參考下js閉包
閉包前要了解的知識
1. 函式作用域
(1).js語言特殊之處在於函式內部可以直接讀取全域性變數
複製** **如下:
<
script
type
="text/j**ascript"
>
varn
=100
;function
parent()
parent();
//100
script
>
如果在php裡
複製** **如下:
<?
php$n=100;
function parent()
parent();//會報錯 n未定義
?>
(2).在函式外部無法讀取函式內的區域性變數
複製** **如下:
<
script
type
="text/j**ascript"
>
function
parent()
parent();
alert(m);
//報錯 m未定義
script
>
注意函式內部宣告變數時一定要加var,否則就宣告了乙個全域性變數
複製** **如下:
function parent()
parent();
alert(m);//50
//當然在php裡更是如此了,
複製** **如下:
<?
phpfunction parent()
parent();
echo $m;//50
?>
//沒global的話,一樣會報沒定義的錯誤
有時,需要得到函式內部的的區域性變數,就需要變通的方法實現利用js變數作用域的特點,如在函式內部定義子函式,對於子函式來說,父函式就是它的全域性,子函式可以訪問父函式裡的變數(對於整個js**來說又是區域性變數)
複製** **如下:
<
script
type
="text/j**ascript"
>
function
parent()
return
son;
}vars=
parent();
//將結果儲存在全域性裡
s();
//50
script
>
parent內部所有區域性變數對其子函式來說都是可見的,但其子函式內的區域性變數對其父函式是不可見的,這就是js特有的鏈式作用域結構,子物件會一級一級地向上查詢所有父物件的變數,父物件的所有變數對子物件都是可見的,反之不成立!上面的son函式就是閉包
有些同學可能這樣
複製** **如下:
function parent()
}parent();
son()//會報 函式son未定義
注意 在j**ascript裡,在函式裡宣告的函式都是區域性的,函式執行完後就釋放了
注意這點與php的區別
複製** **如下:
<?
phpfunction parent()
}parent();
son();//輸出50 不會報錯
?>
閉包函式內部定義函式,連線函式內部和外部的橋梁
閉包的作用有2個:
一是前面提到的讀取函式內部的變數,
二是讓這些變數的值儲存在記憶體中,實現資料共享
下面是幾個閉包的例子
複製** **如下:
<
script
type
="text/j**ascript"
>
varcnt=(
function
()})();
cnt();//0
cnt();//1
cnt();//2
cnt();//3
script
>
把匿名函式的執行結果(即對裡面子函式的宣告賦給全域性變數cut),i就儲存在記憶體裡了
執行cut()時就直接從記憶體取值了,i只有cnt()函式才能呼叫,直接alert(i)是不行的
還可以向閉包內傳參
複製** **如下:
var cnt=(function(num)
})(5);
cnt();//5
cnt();//6
cnt();//7
//當然還可以呼叫時傳參
var cnt=(function()
})();
cnt(1);//1
cnt(2);//3
cnt(3);//5
為了對閉包有更好的理解,我們看以下**
比如我想返回乙個陣列,陣列裡面有5個函式,第乙個函式彈出0,第二個彈出1...
**如果這樣寫
複製** **如下:
function box()
}return arr;
}var a
=box();
alert(a);//包含五個函式體的陣列
alert(a[0]());
alert(a[1]());
彈出的函式體
function() }
最後這個i是4,之後++成為5
for迴圈停止
發現均彈出5,明顯不符合我們的要求
解決方案1
自我即時執行裡面的函式
複製** **如下:
function box())(i);
}return arr;
}var a
=box();
for(var i
=0;ialert(a);
}但是我們發現 返回的陣列裡的元素是函式執行的結果,但我們想要的是函式有得公升級我們的**
解決方案2
閉包實現
複製** **如下:
function box()
})(i);
}return arr;
}var arr
=box();
for(var i
=0;i<5;i++)
關鍵**
複製** **如下:
arr=(function(num)
})(i);
i=0
時 arr[0]
=(function(num)})(0);
1時arr[1]
=(function(num)})(1);
以上就是閉包的好處!非常簡單實用吧。
js 閉包例項
var db function 建立乙個函式,這個函式提供一些訪問data的資料的方法 return function key,val getelse set 我們可以呼叫這個匿名方法 返回這個內部函式,它是乙個閉包 db x 返回 undefined db x 1 設定data x 為1 db x...
js 閉包例項
var db function 建立乙個函式,這個函式提供一些訪問data的資料的方法 return function key,val getelse set 我們可以呼叫這個匿名方法 返回這個內部函式,它是乙個閉包 db x 返回 undefined db x 1 設定data x 為1 db x...
JS經典閉包例項
function fun n,o var a fun 0 a.fun 1 a.fun 2 a.fun 3 var b fun 0 fun 1 fun 2 fun 3 var c fun 0 fun 1 c.fun 2 c.fun 3 複製 問 三行a,b,c的輸出分別是什麼?首先來看第一行 var ...