avaScript中除了自定義函數之外,還有匿名函數?什么是匿名函數?
1. 匿名函數:沒有函數名稱的函數。
如:定義一個匿名函數,打印5個星星。
<script>
function (){ //沒有函數名稱
for(var i=0;i<5;i++){
document.write("*");
}
}
</script>
2. 調用匿名函數有2種方法:
(1) 通過變量名調用匿名函數可以理解為將整個匿名函數瀆職給一個變量
然后在body標簽中,定義一個按鈕:
(2) 事件名調用匿名函數
同樣在在body標簽中,先定義一個按鈕:注意在input標簽中我們不通過onclick來調用匿名函數
然后我們通過2個事件調用2個匿名函數:
注意:window.onload:頁面加載時觸發的事件,這里也就是頁面加載進來調用第一匿名函數
document.getElementById("btn"):獲取id為btn的元素,也就是將按鈕獲取過來;document.getElementById("btn").onclick:點擊按鈕時,觸發第二個匿名函數
一節 幫你精通JavaScript:簡單求積分的方法 中,我們分享了應用抽象的sum函數近似求pi值的方法:
求pi的序列
function pi_sum(a, b) {
function pi_term(x) {
return 1 / (x * (x+2));
}
function pi_next(x) {
return x + 4;
}
return sum(pi_term, a, pi_next, b);
}
//該函數收斂于pi/8
此案例中,我們不得不一本正經的寫出兩個“微不足道”的函數的定義,pi_term與pi_next,只為能在sum函數中順利的調用。如果不繁瑣費力的逐個定義,而只用其數學關系,豈不妙哉。
Lambda-Expression應運而生,pi_term與pi_next可被直接寫為:
x=> x + 4 //pi_next
x=> 1 / (x * (x + 2)) //pi_term
此語法簡潔優美,輸入 x 然后輸出所得值,用lambda-function重新撰寫pi_sum函數:
function pi_sum(a, b) {
return sum(x=> 1 / (x * (x + 2)),
a,
x=> x + 4,
b);
}
匿名函數的語法為:
(parameters=> expression)
匿名函數與define的函數是等效的, 比如:
function plus4(x) {
return x + 4;
}
//等效于
const plus4=(x=> x + 4); //加上括號,視覺上更加清晰
函數的調用也是相同的:
((x, y, z)=> x + y + square(z))(1, 2, 3);
從直覺上,我們可以將lambda-function的語法逐步拆解:
從了解js通過canvas壓縮圖片上傳功能以后,小白對javascript的敬畏之心又提升了一大截,這兩天在練習的時候發現自己平時熟悉的代碼變得陌生起來,比如為什么定義函數時這兩個方式都可以用。
帶著這個疑問,小白找到了老朱。“朱哥,為啥在js里面要用兩種定義函數的方式呢?”
老朱:“嚴格意義上來說上面那個不是定義一個函數,而是將一個變量指向了一個匿名函數,這里是引用的關系。你可以控制臺輸出一下兩個函數名看看。”
小白執行了一下輸出以后驚訝的說道:“果然不一樣啊,一個有函數名,一個沒有函數名。”
老朱:“在js中匿名函數用處非常大,這幾天我們寫的代碼里面有很多的匿名函數,你可以找找。”
小白:“哇,隨便翻了一下昨天的代碼里面就有匿名函數啊。這段點擊按鈕上傳圖片的代碼中就有兩個。”
老朱:“匿名函數非常有個特點,匿名函數如果沒有被引用,用完后會被銷毀,也就是垃圾回收釋放內存。如果被引用,而引用它的那個變量一直在內存中,它指向的匿名函數就會一直存在,不會被銷毀。比如上面的代碼中click里面的匿名函數沒有被引用,用完后會被銷毀,匿名函數中的success指向的匿名函數被引用,只有success被銷毀時,這個匿名函數才會被回收。垃圾回收這塊說起來會比較復雜,我們有時間詳細聊聊。”
老朱頓了一下接著說道:“之前我們用到的匿名函數基本都用在了參數傳遞和引用上,在js中匿名函數還有一個非常重要的用法就是在頁面加載以后執行一個匿名函數。”
“這個函數在頁面加載后會立即執行,如果函數有參數,可以通過最后面的小括號進行傳參。如果這個頁面被其他頁面加載調用,這里的匿名函數被加載以后就會立即執行,由于匿名函數中我們使用了var進行變量定義,因此匿名函數中的變量不會與主頁面中的變量沖突,匿名函數執行結束以后內部的變量也會被銷毀,不會占用內存。”
“另外如果你的頁面中引入很多其他js文件,為了避免變量沖突,也需要在頁面中使用上面的匿名函數來規避風險。”
想學H5的朋友可以關注老爐,您的關注是我持續更新《小白HTML5成長之路》的動力!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。