函数是什么?这里就不做过多的解释了。我们直接进入主题:
一、函数的定义
1、函数声明(需要关注的点是:函数声明的提升)
function funcName(arg1,arg2,arg3){ //需要执行的内容 }
2、函数表达式(需要关注的点是:具名函数表达式的函数名只能在创建函数内部使用)
var myFunc=function(){ //需要执行的代码 }
var myFunc=function my(){ //需要执行的代码 }
当然还有其他的创建方法,但是不是很常用也不推荐,所以就不给大家示范了,如Function,eval(),自执行函数等
二、函数声明提升
来看两端代码:
sayLove("林丽君","张俊祺"); function sayLove(avg1,avg2){ console.log(avg1,"love",avg2); }
这个时候我们的代码不会报错,可是看一下函数表达式:
sayLove("林丽君","张俊祺"); var sayLove= function(avg1,avg2){ console.log(avg1,"love",avg2); }
这时候我们的程序会找不到sayLove这个函数,原因就是函数声明提升,也就是说我们可以把函数声明放在调用它的语句后面
三、具名函数表达式的函数名只能在创建函数内部使用
怎么来理解这话呢?不废话,直接上代码:
var myFunc=function my(){ console.log(1,typeof my); console.log(2, typeof myFunc); }; myFunc(); console.log(3,typeof my); console.log(4, typeof myFunc); //1 "function" //2 "function" //3 "undefined" //4 "function"
上面的代码告诉我们对于具名函数构成的函数表达式,我们是不能再函数的外部进行调用,只能在具名函数的内部被调用,再来看一个例子:
var obj={ name:"林丽君", myFunc:function(){ console.log(myFunc); } }; obj.myFunc(); //这个时候我们的程序会报myFunc is not defined(…)的错误
那我们应该怎么样来访问呢,来看正确的写法:
var myFunc=function(){ console.log(myFunc); }; myFunc();
综合上面两段代码,我们的结论就是使用var或者非对象内部的函数表达式,可以访问到当前函数的变量,在函数内部不能访问到。
四、函数递归
我们有下面一个累加的函数,看代码:
function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1); } }
如果我们这样做,来看看会发生什么事情:
function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1); } } console.log(factorial(3));//6 var another=factorial; console.log(another(3));//6 factorial=null; console.log(another(3));//报错factorial is not a function(…)
这是因为我们的another()里面还继续调用我们的factorial(num-1);为了使我们的代码更加健壮,我们可以使用arguments.callee,它指向的是正在执行函数的指针,下面来看看它的使用方法:
function factorial(num){ if(num<=1){ return 1; }else{ return num*arguments.callee(num-1); } } console.log(factorial(3));//6 var another=factorial; console.log(another(3));//6 factorial=null; console.log(another(3));//6 //记住,是当前函数的引用,所以当我们的函数有好几个参数的时候,就可以在arguments.callee()的里面添加几个参数