函数表达式

Posted czhyuwj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数表达式相关的知识,希望对你有一定的参考价值。

函数表达式

函数表达式的特征
  声明方式:
    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任然有效。 这种在严格与非严格模式都是能通过的。

以上是关于函数表达式的主要内容,如果未能解决你的问题,请参考以下文章

函数声明函数表达式匿名函数

理解函数表达式的函数名称

函数声明与表达式

SqlServer函数的聚合函数

JS-[函数声明&函数表达式]

js函数声明和函数表达式的区别