1. 程式人生 > >JavaScript函式表示式

JavaScript函式表示式

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);
		}
	}
這個函式表面看起來沒有什麼問題,但下面的程式碼卻有可能導致它出錯~~
<!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>
將上面的js部分程式碼換成下面的程式碼就不會報錯了
	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。即便把函式賦值給了另一個變數,函式的名字依然有效,所以遞迴呼叫可以正確完成。