JavaScript函式表示式
阿新 • • 發佈:2019-01-05
1、函式表示式特點
函式表示式不同於函式宣告,函式宣告要求有名字,但函式表示式不需要,沒有名字的函式表示式也叫做匿名函式。
函式表示式不同於函式宣告,函式宣告要求有名字,但函式表示式不需要,沒有名字的函式表示式也叫做匿名函式。
函式表示式能夠建立函式再賦值給變數,也能夠把函式作為其他函式的值返回。
在把函式當成值的情況下,都可以使用匿名函式。不過,這並不是匿名函式的唯一用途。<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>把函式作為其他函式的值返回</title> </head> <body> </body> <script type="text/javascript"> function createComparison(propertyName){ return function(object1,object2){//一個函式裡面嵌套了另一個函式,所以說函式裡面是可以有函式的~~ var value1 = object1[propertyName]; var value2 = object2[propertyName]; if(value1<value2){ return -1; } else if(value1>value2){ return 1; } else{ return 0; } } } var data = [{name:"jm",age:19},{name:"ly",age:18},{name:"zll",age:17}];//包含三個物件的陣列 data.sort(createComparison("name")); for(var i=0;i<data.length;i++){ console.log(data[i].name); } data.sort(createComparison("age")); for(var i=0;i<data.length;i++){ console.log(data[i].name); } </script> </html>
2、使用函式表示式實現遞迴
遞迴函式是一個通過名字呼叫自身的情況下構成的,如下所示:
function factorial(num){
if(num<=1){
return 1;
}
else{
return num*factorial(num-1);
}
}
這個函式表面看起來沒有什麼問題,但下面的程式碼卻有可能導致它出錯~~
將上面的js部分程式碼換成下面的程式碼就不會報錯了<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>表面看起來沒有問題的經典遞迴函式</title> </head> <body> </body> <script type="text/javascript"> function factorial(num){ if(num<=1){ return 1; } else{ return num*factorial(num-1); } } var anotherFactorial = factorial; factorial = null; alert(anotherFactorial(4)); // 分析問題出現的原因:指向原始函式的引用只剩下一個。但是在接下來呼叫anotherFactorial的時候由於必須執行factorial(),而factorial已經不再是函式; </script> </html>
var factorial = (function f(num){
if(num<=1){
return 1;
}else{
return num*f(num-1);
}
});
var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(4));
以上程式碼建立了一個名為f()的命名函式表示式,然後將它賦值給變數factorial。即便把函式賦值給了另一個變數,函式的名字依然有效,所以遞迴呼叫可以正確完成。