前面讲过,定义函数的方式有两种:一种是函数声明,另一种是函数表达式。
函数声明:
1 2 3 | function functionName(arg0,arg1,arg2){ //函数体 } |
关于函数声明,一个重要的特征就是函数声明提升,意思就是在执行代码之前会先读取函数声明。这就意味着可以把函数声明放到调用它的语句之后。
函数表达式:
1 2 3 | var functionName= function (arg0,arg1,arg2){ //函数体 } //最常用的形式 |
能够创建匿名函数在赋值给变量,也能把匿名函数作为其他函数的返回值返回。
1.递归
递归函数是在一个函数通过名字调用自身的情况下构成的。
下面是一个经典的递归阶乘的函数。
1 2 3 4 5 6 7 8 9 10 11 | function factorial(num){ if (num<=1){ return 1; } else { return num*factorial(num-1); } } var anotherFactorial=factorial; factorial= null ; alert(anotherFactorial(4)); |
这个是错误的。
我们可以用arguments.callee解决这个问题,arguments.callee是一个指向正在执行的函数的指针,因此可以用它来实现对函数的递归第调用。
1 2 3 4 5 6 7 8 9 10 11 | function factorial(num){ if (num<=1){ return 1; } else { return num*arguments.callee(num-1); } } var anotherFactorial=factorial; factorial= null ; alert(anotherFactorial(4)); |
但是在严格模式下,脚本是不能访问arguments.callee的。我们可以使用函数表达式来达成相同的结过。
1 2 3 4 5 6 7 8 9 10 11 | var factorial=( function f(num){ if (num <=1 ){ return 1 } else { return num * f(num-1); } }); var anotherFactorial=factorial; factorial= null ; alert(anotherFactorial(4)); |
来自为知笔记(Wiz)