1.函数声明和函数表达式
函数声明需要被调用才会执行相应的内容,而函数表达式则相当于调用了函数。
如下:
// 这是函数声明,没有看到;号
function sum(num1, num2) {
// 函数体
}
// 这是函数表达式
var result = function(num1, num2) {
// 函数体
}
2.声明提升(function declaration hoisting)
函数声明和函数表达式涉及到到函数声明提升的问题。
即在js中,函数声明会被提到顶部,解析器会率先读取函数声明,并使得其在执行任何代码之前可以执行;而表达式则必须等到解析器执行到它所在的代码行时,才会真正地被解释执行。
注:对于函数表达式中的函数定义是不会提前的。
注:对于变量,变量也会声明提前,但是变量的初始化则在代码所在的位置执行,不会提前。
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<p id="result">Show</p>
<script type="text/javascript">
alert(sum(4, 2));
function sum(num1, num2) {
return num1 + num2;
}
function sum(num1, num2) {
return (num1 + num2) * 2;
}
</script>
</body>
</html>
上面的代码可以正常的运行并且输出结果是12;
原因是:声明提前,但是因为第二个函数定义的名称与参数与第一个相同,所以覆盖了第一个,声明提前后,当执行到语句alert(sum(4, 2))时,就会得到相应的结果,所以是12。
3.函数作为参数
一个函数可以想传递参数一样传递给另一个函数。
举个例子:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<p id="result">Show</p>
<script type="text/javascript">
function addOne(num) {
return num + 1;
}
function callSomeFunction(someFunction, someArgument) {
return someFunction(someArgument);
}
var result = callSomeFunction(addOne, 1);
alert(result);
</script>
</body>
</html>
4.返回一个函数
一个函数可以作为另外一个函数的结果返回。
举个例子:
注:数组的sort方法可以传入一个函数作为参数,因为如果是按照默认的排序方式的话,10小于2(因为1的ASCII码比2小),但是这不符合我们的要求,所以常常会传入一个比较函数。
<script type="text/javascript">
function createCompareFunction(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:"Ann", age:20}, {name:"Tome", age:22}];
data.sort(createCompareFunction("name"));
</script>