码迷,mamicode.com
首页 > 其他好文 > 详细

函数表达式

时间:2016-06-25 23:00:08      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:

函数表达式

函数表达式的特征
  声明方式:
    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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!