摘要:概要當中的函數(shù)站在不同的角度有不同的分類和應(yīng)用本文站在高階函數(shù)的角度來討論當中函數(shù)的應(yīng)用場景。解決老版本瀏覽器函數(shù)兼容性問題判斷數(shù)據(jù)類型高階函數(shù)實現(xiàn)也就是面向切面編程在中這個概念基礎(chǔ)且重要。
概要
js當中的函數(shù)站在不同的角度有不同的分類和應(yīng)用,本文站在高階函數(shù)的角度來討論js當中函數(shù)的應(yīng)用場景。
首先明確高階函數(shù)定義:
函數(shù)可以作為參數(shù)被傳遞
函數(shù)可以作為返回值輸出
應(yīng)用場景 函數(shù)作為參數(shù)被傳遞這種情況其實是比較常見的,日常用的挺多的,例如ajax請求成功之后的callback函數(shù)、各種插件,框架當中的鉤子函數(shù)等等。下面舉個我們常用的例子:
var tmpAry=[2,1,3]; tmpAry.sort(function(a,b){ return a-b; }); console.log(tmpAry); //[1,2,3]
目的:把函數(shù)中易變或公用邏輯抽離,封裝成函數(shù)參數(shù),隔離變與不變部分,達到更好的封裝和復(fù)用。
函數(shù)作為返回值輸出這個其實我在日常寫代碼中用的比較少,但并不能說明這個不常見,所以下面我會多舉幾個例子。
解決老版本瀏覽器bind函數(shù)兼容性問題
Function.prototype.bind=function(context){ var self=this; return function(){ return self.apply(context,args); } }判斷數(shù)據(jù)類型
var isType=function(type){ return function(obj){ return Object.prototype.toString.call(obj)==="[object "+ type + "]"; } } var isString=isType("String"); console.log(isString("gcy")); //true高階函數(shù)實現(xiàn)aop
AOP也就是面向切面編程,在java中這個概念基礎(chǔ)且重要。具體就是通過reflect或動態(tài)代理(jdk動態(tài)代理和cglib動態(tài)代理)動態(tài)的在業(yè)務(wù)函數(shù)之前或之后添加一些
可復(fù)用的代碼邏輯,例如典型的日志統(tǒng)計、權(quán)限控制等等。用aop的目的就是希望業(yè)務(wù)邏輯模塊高內(nèi)聚,同時達到非業(yè)務(wù)公共模塊可復(fù)用,易維護。
Function.prototype.before=function (beforefn) { var _self=this;//保存原函數(shù)的引用 return function () { //代理函數(shù) 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; //執(zhí)行原函數(shù),并返回原函數(shù)的執(zhí)行結(jié)果 } } var func=function () { console.log("ing"); } func=func.before(function () { console.log("before") }).after(function () { console.log("after"); }) func(); //before ing after
這個其實有很多應(yīng)用場景,比如統(tǒng)計函數(shù)執(zhí)行時間,動態(tài)改變函數(shù)參數(shù)等等。
function currying首先currying的概念是部分求值,具體含義就是指動態(tài)的接受一些參數(shù),不立即求值,在需要計算求值時訪問之前閉包中保存的參數(shù),一次性進行求值。
下面是一個部分求值通用的currying函數(shù)。
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; //指向當前匿名函數(shù),以便于參數(shù)連續(xù)暫存 } } } var cost=(function () { var money=0; return function () { for(var i=0,len=arguments.length;i總結(jié) 其實高階函數(shù)應(yīng)用場景很多,我只是總結(jié)列舉了一些自己學(xué)習(xí)中碰到的典型例子,以后遇到一些適當?shù)?會繼續(xù)完善。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/81569.html
摘要:前端每周清單專注前端領(lǐng)域內(nèi)容,以對外文資料的搜集為主,幫助開發(fā)者了解一周前端熱點分為新聞熱點開發(fā)教程工程實踐深度閱讀開源項目巔峰人生等欄目。背后的故事本文是對于年之間世界發(fā)生的大事件的詳細介紹,闡述了從提出到角力到流產(chǎn)的前世今生。 前端每周清單專注前端領(lǐng)域內(nèi)容,以對外文資料的搜集為主,幫助開發(fā)者了解一周前端熱點;分為新聞熱點、開發(fā)教程、工程實踐、深度閱讀、開源項目、巔峰人生等欄目。歡迎...
摘要:避免脆弱的基類問題。紅牌警告沒有提到上述任何問題。單向數(shù)據(jù)流意味著模型是單一的事實來源。單向數(shù)據(jù)流是確定性的,而雙向綁定可能導(dǎo)致更難以遵循和理解的副作用。原文地址 1. 你能說出兩種對 JavaScript 應(yīng)用開發(fā)者而言的編程范式嗎? 希望聽到: 2. 什么是函數(shù)編程? 希望聽到: 3. 類繼承和原型繼承的不同? 希望聽到 4. 函數(shù)式編程和面向?qū)ο缶幊痰膬?yōu)缺點? ...
摘要:和類在開始時遇到類組件,只是需要有關(guān)類的基礎(chǔ)。畢竟,中的條件呈現(xiàn)僅再次顯示大多數(shù)是而不是特定的任何內(nèi)容。 在我的研討會期間,更多的材料是關(guān)于JavaScript而不是React。其中大部分歸結(jié)為JavaScript ES6以及功能和語法,但也包括三元運算符,語言中的簡寫版本,此對象,JavaScript內(nèi)置函數(shù)(map,reduce,filter)或更常識性的概念,如:可組合性,可重用...
摘要:一個標準性的事件就是年的橫空出世。引擎快速處理能力和異步編程風(fēng)格,讓開發(fā)者從多線程中解脫了出來。其次,通過異步編程范式將其高并發(fā)的能力發(fā)揮的淋漓盡致。它也僅僅是一個處理請求并作出響應(yīng)的函數(shù),并無任何特殊之處。 showImg(https://segmentfault.com/img/remote/1460000010819116); 在正式學(xué)習(xí) Express 內(nèi)容之前,我們有必要從大...
摘要:來源編程精解中文第三版翻譯項目原文譯者飛龍協(xié)議自豪地采用谷歌翻譯部分參考了編程精解第版確定編程語言中的表達式含義的求值器只是另一個程序。若文本不是一個合法程序,解析器應(yīng)該指出錯誤。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項目原文:Project: A Programming Language 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 自豪地采用...
閱讀 3426·2021-11-24 09:38
閱讀 1409·2021-11-22 15:08
閱讀 1501·2021-09-29 09:35
閱讀 505·2021-09-02 15:11
閱讀 1328·2019-08-30 12:55
閱讀 414·2019-08-29 17:16
閱讀 518·2019-08-29 11:30
閱讀 446·2019-08-26 13:23