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