javaScript中的函數應用

概要

js當中的函數站在不一樣的角度有不一樣的分類和應用,本文站在高階函數的角度來討論js當中函數的應用場景。java

首先明確高階函數定義:ajax

  1. 函數能夠做爲參數被傳遞
  2. 函數能夠做爲返回值輸出

應用場景

函數做爲參數被傳遞

這種狀況實際上是比較常見的,平常用的挺多的,例如ajax請求成功以後的callback函數、各類插件,框架當中的鉤子函數等等。下面舉個咱們經常使用的例子:編程

var tmpAry=[2,1,3];

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

目的:把函數中易變或公用邏輯抽離,封裝成函數參數,隔離變與不變部分,達到更好的封裝和複用。瀏覽器

函數做爲返回值輸出

這個其實我在平常寫代碼中用的比較少,但並不能說明這個不常見,因此下面我會多舉幾個例子。閉包

解決老版本瀏覽器bind函數兼容性問題app

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

總結

其實高階函數應用場景不少,我只是總結列舉了一些本身學習中碰到的典型例子,之後遇到一些適當的,會繼續完善。this

相關文章
相關標籤/搜索