標籤:logs etc 回收 hello 說明 nbsp etag tag java
匿名函數是相對於有名字的函數
如function setAge(){}函數名為setAge
而類似於function(){}則就是一個匿名函數
有名字的函數執行時可以寫成setAge(),而沒有名字的函數則執行要寫成(function())();
另一種方式是把匿名函數賦值給一個變數來使用
var a=function(){alert("hello,world");}a();
匿名函數傳參
(function(age){return age;})(100);
匿名函數產生閉包
閉包簡單來說就是一個函數裡面還有函數(一般來說是匿名函數),看代碼:
function box(){var a=10;return function(){alert("hello") }}
box()//返回function(){ alert("hello") }一串代碼
box()()//再加一個()才執行了匿名函數,返回hello
關於閉包解釋,上面的說明太粗俗了,下面具體說明
有權訪問另一個函數範圍內變數的函數都是閉包
閉包源於js範圍鏈問題,在js中局部變數可以直接存取全域變數,而全域變數無法訪問局部變數
function box(){
var a=10;
}
alert(a)//未定義,全域無法訪問函數體內的var a=10變數,但有時我們需要外部能夠取得這個局部的a變數,這時我們怎麼做呢?閉包方式來了
利用js中局部變數可以直接存取全域變數,而全域變數無法訪問局部變數這一原理,我們在box(){}內再構建一個函數,這事var a對於這個新構建的函數來說就是他的“全域變數”
例如
function getCircle(){var pi=3.1415926;//局部變數,怎樣要外面的alert取得pi呢return function (){//寫一個函數,這個函數可以取得pi的值 return pi;//這個pi值一旦調用getCircle()就可以return出匿名函數裡的這個pi}}alert(getCircle()());
使用閉包的好處有什嗎?
在js中一旦function執行完畢,裡面的變數都會被記憶體回收,被銷毀,可以這樣理解,js中局部變數優先於全域變數執行,函數體執行完畢後,就被銷毀,所以全域變數就無法訪問局部了。在一些情形中,我們需要將局部變數儲存下來,我們就要用到閉包了。
總結:閉包好處:
一個是前面提到的可以讀取函數內部的變數,另一個就是讓這些變數的值始終保持在記憶體中。
function box(){var a=0;return function(){ a=a+1;return a;}}var b=box();b();//1b();//2
每次執行一次b() var a都不會清零,而是保留了上次的結果!
javascript匿名函數與閉包