JavaScript-函数

函数是什么?这里就不做过多的解释了。我们直接进入主题:

一、函数的定义

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()的里面添加几个参数

 

posted @ 2016-03-26 02:48  baby丽君君  阅读(321)  评论(0编辑  收藏  举报