js當中的函數站在不一樣的角度有不一樣的分類和應用,本文站在高階函數的角度來討論js當中函數的應用場景。java
首先明確高階函數定義:ajax
這種狀況實際上是比較常見的,平常用的挺多的,例如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也就是面向切面編程,在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
這個其實有不少應用場景,好比統計函數執行時間,動態改變函數參數等等。函數
首先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