- 定义函数的方式有两种:一是函数声明,另一种是函数表达式。
1、函数声明语法
function functionName(arg0, arg1, arg2) {
//函数体
}
//只在Firefox、Safari、Chrome 和Opera 有效
alert(functionName.name); //"functionName"
- 函数声明有一个重要特征是函数声明提升,在执行代码之前会先读取函数声明。
sayHi();
function sayHi(){
alert("Hi!");
}
//这个例子不会抛出错误,因为在代码执行之前会先读取函数声明。
2、函数表达式语法形式
var functionName = function(arg0, arg1, arg2){
//函数体
};
//函数表达式有几种不同的语法形式。这是最常见的一种形式。在使用前必须先赋值。
sayHi(); //错误:函数还不存在
var sayHi = function(){
alert("Hi!");
};
- 这种形式创建一个函数并将它赋值给变量functionName。这种情况下创建的函数叫做匿名函数或拉姆达函数
理解函数声明和函数表达式的区别
//不要这样做!
if(condition){
function sayHi(){
alert("Hi!");
}
} else {
function sayHi(){
alert("Yo!");
}
}
//在js中属于无效语法,javascript引擎会尝试修正错误,但各浏览器的修正机制不一致。
- 使用函数表达式
//可以这样做
var sayHi;
if(condition){
sayHi = function(){
alert("Hi!");
};
} else {
sayHi = function(){
alert("Yo!");
};
}
//不同的函数会根据condition 被赋值给sayHi。
- 能够创建函数再赋值给变量,也就能够把函数作为其他函数的值返回.
function createComparisonFunction(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;
}
};
}
递归
- 递归函数是在一个函数通过名字调用自身的情况下构成的
function factorial(num){
if (num <= 1){
return 1;
} else {
return num * factorial(num-1);
}
}
var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(4)); //出错!
- 为解决耦合问题,可以使用arguments.callee
function factorial(num){
if (num <=1) {
return 1;
} else {
return num * arguments.callee(num-1)
}
}
//但在严格模式下,不能通过脚本访问arguments.callee,访问这个属性会导致错误。
- 可以使用命名函数表达式来实现此递归函数
var factorial = (function(num){
if(num<=1){
return 1;
}else{
return num*(num-1);
}
})
//这种方式在严格模式和非严格模式下都行得通。