定义函数的方式有两种:
- 函数声明
function functionName(arg0, arg1, arg2) {
// 函数体
}
函数声明提升:执行代码之前会先读取函数声明,可以把函数声明方在调用它的语句后面。
sayHi();
function sayHi() {
alert("Hi!");
}
- 函数表达式
var fucntionName = function(arg0, arg1, arg2) {
// 函数体
};
创建一个函数并把它赋值给变量functionName,这种情况下创建的函数叫做匿名函数,因为function关键字后面没有标识符。
函数表达式和其他表达式一样,在使用前必须先赋值:
sayHi(); // 错误:函数还不存在
var sayHi = function() {
alert("Hi!");
}
递归
递归函数是在一个函数通过名字调用自身的情况下构成的:
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()
已经不再是函数,所以就会导致错误,可以用arguments.callee
解决这个问题。
function factorial(num) {
if (num < 1) {
return 1;
} else {
return num * arguments.callee(num - 1);
}
}
arguments.callee
是一个指向正在执行的函数的指针。
在严格模式下,不能通过脚本访问arguments.callee
,可以使用命名函数表达式来达成相同的结果:
var factorial = (function f(num) {
if (num < 1) {
return 1;
} else {
return num * f(num - 1);
}
});