标签:
函数表达式
函数表达式的特征
声明方式:
1> 函数声明
2> 函数表达式
函数声明如下:
1 function functionNmae(){ 2 return "ERRO"; 3 }
表达式声明
1 var functionNmae = function(){ 2 return "ERRO"; 3 }
第一种方式:关于函数声明主要是:函数声明提升,意思是在执行代码之前会先读取函数声明。这就意味着可以把函数声明放在调用它的后面。
1 functionNmae() //正确 2 function functionNmae(){ 3 return "ERRO"; 4 }
5 functionNmae.name // functionNmae
第二种方式:表达式声明,在这种情况下创建函数叫做匿名函数,因为function关键字后面没有标识符。匿名函数的name属性是空字符串。
functionNmae(); //erro var functionNmae = function(){ return "ERRO"; }
使用函数实现递归
递归函数是在一个函数通过名字调自身情况下构成的,如下所示
1 function factorial(num){ 2 if(num<=1) 3 return 1; 4 else 5 return num * factorial(num-1); 6 }
这是一个经典的递归阶乘函数。虽然这个函数表面没有什么问题,但是下面的代码可能导致出错。
1 var anotherFactorial = factorial; 2 factorial = null; 3 alert(anotherFactorial(4)); //出错
这个因为在执行时,factorial已经不是函数了,所以会导致报错。在这种情况下我们可以使用arguments.callee 可以解决这个问题。
我们知道,arguments.callee 是一个指向正在执行的函数的指针,因此可以用它来实现对函数的递归调用,例如
1 function factorial(num){ 2 if(num<=1) 3 return 1; 4 else 5 return num * arguments.callee(num-1); 6 }
通过使用arguments.callee 代替函数名,可以确保无论怎么调用函数都不会出问题。
注意:严格模式下不能通过脚本访问 arguments.callee 访问这个属性会导致报错。不过可以使用命名函数表达式来达成相同的结果。例如
var factorial = (function f(num){ if(num<=1) return 1; else return num * arguments.callee(num-1); });
以上代码创建一个名为 f()的命名函数表达式,然后将它赋值给变量 factorial. 即便把函数赋值给另一个变量,函数的名字f任然有效。 这种在严格与非严格模式都是能通过的。
标签:
原文地址:http://www.cnblogs.com/czhyuwj/p/5617056.html