JS中的函数

函数的基本概念

函数的基本概念回顾

函数的概念:
实际开发中,有的时候我们需要多次执行相同代码,或者在特定的时机执行某段代码,函数就可以解决这些问题。
函数可以包装一段代码,并且可以为这段代码取名,通过这个函数名可以达到多次调用效果。

函数的定义:

function 函数名(形参1,形参2...形参N){
    函数体(业务逻辑)
    [return 返回值]
}

函数的执行时机

函数中定义的内容是延迟执行的;
函数中的内容在函数调用的时候才执行;
函数的执行在页面加载前后执行是有顺序的;

函数的返回值

1,如果函数中没有return语句,则函数的返回值为undefined;
2,如果函数中有return语句,函数的返回值为return语句返回的表达式值;

函数的形参和实参

函数的形参和实参::
1,函数的实参个数 = 函数的形参个数,函数正常执行;
2,函数的实参个数 > 函数的形参个数,函数正常执行,忽略多余的实参;
3,函数的实参个数 < 函数的形参个数,函数能够执行,执行过程中可能错误,没有传入的形参在函数体中的值为undefined;

注意,在js中,变量的初始值都为undefined,不是null,JS中,null和undefined是不同的值;

arguments

1,不管函数是否申明了形参,在函数内部都可以直接使用arguments对象来直接引用当前调用函数传入的实参;
2,arguments只能在当前调用的函数内部使用;
3,arguments不是一个数组,是一个伪数组对象,类似jQuery对象,可以通过下标访问对象,并且有length属性;

对象类型识别

1,typeof:
用法,typeof obj;返回一个str,用于显示对象的类型名字;

2,instanceof:
用法,obj instanceof Type:返回一个boolean,用于判断对象是否是指定的类型;

注意,instanceof只针对对象有效,如果是原生类型,使用instanceof无效;原生类型只能通过typeof来判断;

函数的重载

1,java中方法重载回顾:函数重载的目的就是用相同的函数名处理不同的业务;

1,不同的参数个数;
2,不同的参数类型;

2,JavaScript中的函数重载的例子:在jQuery中大量的函数使用了函数重载,通过传入不同的参数个数或者类型,达到不同的逻辑;
3,JavaScript中不直接支持重载,后面声明的方法会覆盖掉前面声明的方法;
4,JavaScript中可以使用代码的方式来模拟方法的重载(注意,模仿重载本质都是用一个方法来模拟多个方法)

1,不同的参数个数:可以直接使用arguments的长度来判断;
2,不同的参数类型:可以使用typeof或者instanceof来判断类型;

让函数更容易使用

1,Js中的函数为了更方便和灵活的使用,常常会很智能的去识别不同的实参组合类型,比如jQuery中大量的方法(post等);
2,解决参数的识别问题,就是在函数中主动的去识别和重新分配参数;
3,完成类似jQuery的post方法的参数使用:

function post(url, data, callback, type){
    if(typeof data == 'function'){
        type = type||callback; 
        callback = data;
        data = undefined;
    }
}

//post("/user.action");
//post("/user.action",{id:1});
//post("/user.action",callbackFn);
//post("/user.action",callbackFn,'json');
//post("/user.action",{id:1},callbackFn,'json');

callee属性

1,在前台完成一个树状结构的匹配或者遍历;会使用到递归操作;
2,递归操作是需要在函数体中重新调用当前这个函数,如果直接写函数的名称,如果外层函数名修改了,内部的递归调用的函数名也要修改;
3,很多JS库,为了让函数体内部不需要依赖这个函数本身的名字,会使用arguments.callee引用当前的函数,使用arguments.callee()来调用当前函数;
4,注意,因为arguments对象只能本函数体使用,所以callee也只在本函数体中有效;

var data = [{
               "id":1,
               "name":"parent",
                "children":[
                    {
                        "id":11,
                        "name":"son1"
                    },
                    {
                        "id":12,
                        "name":"son2"
                    }
                ] 
            }];

函数高级

回调函数

1,在jQuery中经常会使用到回调函数,比如map函数,ajax相关函数,都有callback的存在;
2,什么是回调函数?回调函数就是在调用A函数的时候把B函数作为了参数传递给A函数,在A函数执行到某一个时机的时候,去调用B函数的方法,把B函数的业务加入到A函数的执行流程中,我们就说B函数是回调函数;

匿名函数

1,如果一个function没有名字,那么这个function就叫做匿名函数;
2,匿名函数一般使用在两种模式里面;

1,和回调函数配合使用,直接把一个匿名函数作为回调函数传给主函数;
2,如果一个函数为了避免内容重复执行,只想执行一次,也可以使用匿名函数;
(function(){
    //逻辑
})();

闭包

闭包的概念:在函数内部,使用函数外部声明的资源:

var msg = "哈哈";
function showMsg(){
    alert(msg);
}

闭包最大的用处是可以配合匿名函数把变量变成私有化;

    (function(){
        var number=0;
        window.getId=function(){
            return number++;
        }
    })();

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注