定义函数的方式
定义函数表达式的方法有两种,一种是函数声明,另一种是函数表达式.
函数声明的方式,关于函数声明的方式,它的一个重要的特性就是函数声明提升(function declaration hoisting),意思是在执行代码之前会先读取函数声明。这就意味着可以把函数声明放在调用它的语句后面,like this
1 sayHi();//声明函数(function declaration hoisting) 2 function sayHi(){ 3 alert("Hi!"); 4 }
函数表达式有多种表达方式,下面是最常见的一种
var func = function(agr1,arg2){//创建匿名函数 alert(arg1 + ‘ ‘ + arg2);//函数体 }
函数表达式与其他表达式一样,使用前必须赋值。比如下面的代码就会导致错误。
var condition = true; //never do this! 不同的浏览器会做出不同的行为 不要这么做! if(condition){ function sayHi(){ alert("Hi!"); } } else { function sayHi(){ alert("Yo!"); } } sayHi();
函数可以赋值给变量,自然也可以当作返回值返回。
递归
就像每一门语言一样,任何方法或者函数解决问题的思路有递归和枚举两种基本思路,但是js中的递归还是有个小陷阱的,这里需要注意。看看下面的代码吧,只是一个简单的求阶乘的函数。
//求阶乘,看起来并没有问题 function factorial(num) { if (num <= 1) { return 1; } else { return num * factorial(num - 1); } } var anotherFactorial = factorial; factorial = null; alert(anotherFactorial(4)); //error!
这里隐藏的问题就是,如果先用一个变量anotherFactorial指向factorial函数对象(函数对象哦),再将fatorial置空(相当于window对象的factorial属性=null),再执行anotherFactorial()时,会发现调用fatorial
时会发生错误的,原因是null不是函数。那么为了避免这样的问题我们可以这样改进这个函数,使用arguments.callee可以解决这个问题。
ss