javaScript中的函数运用

提要

js当中的函数站在差别的角度有差别的分类和运用,本文站在高阶函数的角度来议论js当中函数的运用场景。

起首明白高阶函数定义:

  1. 函数能够作为参数被通报
  2. 函数能够作为返回值输出

运用场景

函数作为参数被通报

这类状况实际上是比较罕见的,日经常使用的挺多的,比方ajax要求胜利今后的callback函数、种种插件,框架当中的钩子函数等等。下面举个我们经常使用的例子:

var tmpAry=[2,1,3];

tmpAry.sort(function(a,b){
    return a-b;
});
console.log(tmpAry);   //[1,2,3]

目标:把函数中易变或公用逻辑抽离,封装成函数参数,断绝变与稳定部份,到达更好的封装和复用。

函数作为返回值输出

这个实在我在一样平常写代码顶用的比较少,但并不能申明这个不罕见,所以下面我会多举几个例子。

处理老版本浏览器bind函数兼容性问题

Function.prototype.bind=function(context){
    var self=this;
    return function(){
        return self.apply(context,args);
    }
}

推断数据类型

var isType=function(type){
    return function(obj){
        return Object.prototype.toString.call(obj)==='[object '+ type + ']';
    }
}
var isString=isType('String');
console.log(isString('gcy'));  //true

高阶函数完成aop

AOP也就是面向切面编程,在java中这个观点基本且主要。详细就是经由过程reflect或动态代办(jdk动态代办和cglib动态代办)动态的在营业函数之前或今后增加一些
可复用的代码逻辑,比方典范的日记统计、权限掌握等等。用aop的目标就是愿望营业逻辑模块高内聚,同时到达非营业大众模块可复用,易保护。

Function.prototype.before=function (beforefn) {
    var _self=this;//保留原函数的援用
    return function () {  //代办函数
        beforefn.apply(this,arguments);
        _self.apply(this,arguments);
    }
};

Function.prototype.after=function (afterfn) {
    var _self=this;
    return function () {
        var ret=_self.apply(this,arguments);
        afterfn.apply(this,arguments);
        return ret;  //实行原函数,并返回原函数的实行效果
    }
}
var  func=function () {
    console.log('ing');
}
func=func.before(function () {
    console.log("before")
}).after(function () {
    console.log("after");
})
func(); //before  ing  after

这个实在有许多运用场景,比方统计函数实行时间,动态转变函数参数等等。

function currying

起首currying的观点是部份求值,详细寄义就是指动态的接收一些参数,不马上求值,在须要盘算求值时接见之前闭包中保留的参数,一次性举行求值。
下面是一个部份求值通用的currying函数。

var currying=function (fn) {
    var args=[];
    return function () {
        if(arguments.length===0){
            return fn.apply(this,args);
        }else{
            [].push.apply(args,arguments);
            return arguments.callee;  //指向当前匿名函数,以便于参数一连暂存
        }
    }
}
var cost=(function () {
    var money=0;
    return function () {
        for(var i=0,len=arguments.length;i<len;i++){
            money+=arguments[i];
        }
        return money;
    }
})();

var cost=currying(cost);
var step1=cost(1);
var step2=step1(2);
var step3=step2(3)
console.log(step3());  //6

总结

实在高阶函数运用场景许多,我只是总结列举了一些本身进修中碰到的典范例子,今后碰到一些恰当的,会继承完美。

    原文作者:jsdt
    原文地址: https://segmentfault.com/a/1190000008395465
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞