JavaScript 高级函数

日期: 2017-07-25         浏览量: 2557

高级函数是指满足下列条件之一的函数。

函数可以作为参数传递

函数可以作为返回值输出



函数作为参数传递


把函数作为参数传递,这代表我们可以抽离出一部分容易变化的业务逻辑。这样一来就可以分离业务代码中变化与不变的部分。其中一个重要的应用场景就是常见的回调函数。


回调函数:


在ajax异步请求应用中,回调函数的使用非常频繁。例如


var getUserInfo = function(userId , callback){

    var url =  'http://xxx.com/getUserInfo?'+userId;

    $.ajax(url , function(data){

        if(typeof callback === "function"){

            callback(data);

        }

    })

}


getUserInfo(123,function(data){

    console.log(data);

})


Array.prototype.sort:


Array.prototype.sort 接受一个函数当做参数,这个函数里面封装了数组元素的排序规则。从Array.prototype.sort 的使用可以看到,我们的目的是对数组进行排序,这是不变的部分;使用什么规则去排序,则是可变的部分。把可变的部分封装在函数参数里面,动态传入 Array.prototype.sort.


[1,2,4,3].sort(function(a,b){

    return a-b;

})

// 输出1234



函数作为返回值输出


相比把函数当作参数传递,函数当作返回值输出的应用场景也许更多,也更能体现函数式编程的巧妙。让函数继续返回一个可执行的函数,意味着运算过程是可延续的。


判断数据类型:


如果我们要判断一个数据是否是数组,在以往我们可以基于鸭子类型的概念去判断,比如判断这个数据有没有 length 属性,有没有 sort 方法 或者 slice 方法等。但更好的方式是用 Object.prototype.toString 来计算。Object.prototype.toString.call(Obj) 返回一个字符串,比如 Object.prototype.toString.call([1,3,4]) 总是返回  '[object Array]'  ,而 Object.prototype.toString.call('123')  总是返回  "[object String]"  . 所以我们可以写一个isType函数。


var isType = function(type){

    return function(obj){

        return Object.prototype.toString.call(obj) === "[object "+type+"]"

    }

}


var isString = isType('String');

var isArray = isType('Array');

var isNumber = isType('Number');


isString('11111111');        //true

isNumber(11111);             //true

isArray([1,2,3,4]);            //true


我们还可以用for循环来批量注册这些 isType 函数:


var Type={};


for(var i=0,type=['Array','String','Number'];i<type.length;i++){

    var t=type[i];

    (function(t){

        Type['is'+t]= function(obj){

            return Object.prototype.toString.call(obj)==='[object '+t+']';

        

     })(t) 

}


Type.isString('11111');     //true

Type.isArray(1);                //false