摘要:改為下面這樣子的代碼初始的執(zhí)行其實(shí)只實(shí)現(xiàn)了部分的應(yīng)用只有一次的判定,而剩余的參數(shù)應(yīng)用都是其返回函數(shù)實(shí)現(xiàn)的,典型的柯里化。
今天接觸到了一個(gè)之前沒(méi)聽(tīng)說(shuō)過(guò)的東東,感覺(jué)很好玩~分享給大家~為了徹底的了解一下相關(guān)概念,特意拜讀了一下張?chǎng)涡翊笊竦南嚓P(guān)文章鏈接如下~:
http://www.zhangxinxu.com/wor...
感謝大神分享,本文將截取大神分享的部分及加上自己的小小理解~
先發(fā)一波定義~(源自百度百科)
在計(jì)算機(jī)科學(xué)中,柯里化(Currying)是把接受多個(gè)參數(shù)的函數(shù)變換成接受一個(gè)單一參數(shù)(最初函數(shù)的第一個(gè)參數(shù))的函數(shù),并且返回接受余下的參數(shù)且返回結(jié)果的新函數(shù)的技術(shù)。這個(gè)技術(shù)由 Christopher Strachey 以邏輯學(xué)家 Haskell Curry 命名的,盡管它是 Moses Schnfinkel 和 Gottlob Frege 發(fā)明的。
大神用于函數(shù)柯里化用的比喻相當(dāng)?shù)男蜗蠓浅S兄诶斫鈤
“柯里化”就像某些官員的把戲,官員要弄7個(gè)老婆,礙于國(guó)策(一夫一妻)以及年老弟衰,表面上就1個(gè)老婆,實(shí)際上剩下的6個(gè)暗地里消化,代碼表示如下:
var curring = function(fn){ // fn 指官員消化老婆的手段 var args = [].slice.call(arguments,1); // 截取arguments中的第一個(gè)生成一個(gè)數(shù)組,也就是當(dāng)前語(yǔ)境下的明面上的合法老婆 return function(){ // 將已有的參數(shù)和新傳進(jìn)來(lái)的參數(shù)合并為一個(gè)數(shù)組,對(duì)應(yīng)已有的合法老婆和新搞定的老婆 var newArgs = args.concat([].slice.call(arguments)); // 將所有的參數(shù)newArgs綁定給fn~ return fn.apply(null,newArgs); } } // 下面為官員如何搞定7個(gè)老婆做測(cè)試 // 獲得合法老婆 var getWife = currying(function(){ var allWife = [].slice.call(arguments); console.log(allWife.join(";")) },"合法老婆"); // 獲得其他6個(gè)老婆 getWife("小老婆1","小老婆2","小老婆3","小老婆4","小老婆5","小老婆6"); // 換一批老婆 getWife("大老婆","小老婆","俏老婆","刁蠻老婆","乖老婆","送上門(mén)老婆"); // 再換一批老婆 getWife("超越韋小寶的老婆");
效果是這樣的~
無(wú)論輸入多少個(gè)參數(shù),都會(huì)打印輸出,且都會(huì)帶著第一個(gè)參數(shù)~
上文代碼fn.apply(null,newArgs)中的null本是應(yīng)該制定fn中this的指向的對(duì)象,沒(méi)有所以就用null啦,算是一個(gè)小技巧~
理解理解之后再想想,這個(gè)東西有什么用啊~~
柯里化有三個(gè)常見(jiàn)的應(yīng)用:
參數(shù)復(fù)用(上文代碼中的合法老婆)
提前返回
這里舉個(gè)很實(shí)用的例子,兼容現(xiàn)代瀏覽器以及IE瀏覽器的事件添加方法:
var addEvent = function(el, type, fn, capture) { if (window.addEventListener) { el.addEventListener(type, function(e) { fn.call(el, e); }, capture); } else if (window.attachEvent) { el.attachEvent("on" + type, function(e) { fn.call(el, e); }); } };
上面的方法有什么問(wèn)題呢?很顯然,我們每次使用addEvent為元素添加事件的時(shí)候,(eg. IE6/IE7)都會(huì)走一遍if...else if ...,其實(shí)只要一次判定就可以了,怎么做?–柯里化。改為下面這樣子的代碼:
var addEvent = (function(){ if (window.addEventListener) { return function(el, sType, fn, capture) { el.addEventListener(sType, function(e) { fn.call(el, e); }, (capture)); }; } else if (window.attachEvent) { return function(el, sType, fn, capture) { el.attachEvent("on" + sType, function(e) { fn.call(el, e); }); }; } })();
初始addEvent的執(zhí)行其實(shí)只實(shí)現(xiàn)了部分的應(yīng)用(只有一次的if...else if...判定),而剩余的參數(shù)應(yīng)用都是其返回函數(shù)實(shí)現(xiàn)的,典型的柯里化。
第三個(gè)常見(jiàn)應(yīng)用: 延遲計(jì)算
var curryWeight = function(fn) { var _weight = []; return function() { if (arguments.length === 0) { return fn.apply(null, _weight); } else { _weight = _weight.concat([].slice.call(arguments)); } } }; var weight = 0; var addWeight = curryWeight(function() { var i=0; len = arguments.length; for (i; i先傳入?yún)?shù),直到調(diào)用的時(shí)候才執(zhí)行計(jì)算~
今天的分享就先到這里了~愿與各位共勉~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/93226.html
摘要:柯里化通用式上面的柯里化函數(shù)沒(méi)涉及到高階函數(shù),也不具備通用性,無(wú)法轉(zhuǎn)換形參個(gè)數(shù)任意或未知的函數(shù),我們接下來(lái)封裝一個(gè)通用的柯里化轉(zhuǎn)換函數(shù),可以將任意函數(shù)轉(zhuǎn)換成柯里化。 showImg(https://segmentfault.com/img/remote/1460000018998373); 閱讀原文 前言 在 JavaScript 中,柯里化和反柯里化是高階函數(shù)的一種應(yīng)用,在這之前...
摘要:函數(shù)柯里化是把支持多個(gè)參數(shù)的函數(shù)變成接收單一參數(shù)的函數(shù),并返回一個(gè)函數(shù)能接收處理剩余參數(shù),而反柯里化就是把參數(shù)全部釋放出來(lái)。但在一些復(fù)雜的業(yè)務(wù)邏輯封裝中,函數(shù)柯里化能夠?yàn)槲覀兲峁└玫膽?yīng)對(duì)方案,讓我們的函數(shù)更具自由度和靈活性。 showImg(https://segmentfault.com/img/bVburN1?w=800&h=600); 柯里化(Curring, 以邏輯學(xué)家Has...
摘要:作為函數(shù)式編程語(yǔ)言,帶來(lái)了很多語(yǔ)言上的有趣特性,比如柯里化和反柯里化。在一些函數(shù)式編程語(yǔ)言中,會(huì)定義一個(gè)特殊的占位變量。個(gè)人理解不知道對(duì)不對(duì)延遲執(zhí)行柯里化的另一個(gè)應(yīng)用場(chǎng)景是延遲執(zhí)行。不斷的柯里化,累積傳入的參數(shù),最后執(zhí)行。作為函數(shù)式編程語(yǔ)言,JS帶來(lái)了很多語(yǔ)言上的有趣特性,比如柯里化和反柯里化。 這里可以對(duì)照另外一篇介紹 JS 反柯里化 的文章一起看~ 1. 簡(jiǎn)介 柯里化(Currying)...
摘要:作為函數(shù)式編程語(yǔ)言,帶來(lái)了很多語(yǔ)言上的有趣特性,比如柯里化和反柯里化。個(gè)人理解不知道對(duì)不對(duì)延遲執(zhí)行柯里化的另一個(gè)應(yīng)用場(chǎng)景是延遲執(zhí)行。不斷的柯里化,累積傳入的參數(shù),最后執(zhí)行。 作為函數(shù)式編程語(yǔ)言,JS帶來(lái)了很多語(yǔ)言上的有趣特性,比如柯里化和反柯里化。 這里可以對(duì)照另外一篇介紹 JS 反柯里化 的文章一起看~ 1. 簡(jiǎn)介 柯里化(Currying),又稱(chēng)部分求值(Partial Evalu...
摘要:如果你對(duì)函數(shù)式編程有一定了解,函數(shù)柯里化是不可或缺的,利用函數(shù)柯里化,可以在開(kāi)發(fā)中非常優(yōu)雅的處理復(fù)雜邏輯。同樣先看簡(jiǎn)單版本的方法,以方法為例,代碼來(lái)自高級(jí)程序設(shè)計(jì)加強(qiáng)版實(shí)現(xiàn)上面函數(shù),可以換成任何其他函數(shù),經(jīng)過(guò)函數(shù)處理,都可以轉(zhuǎn)成柯里化函數(shù)。 我們經(jīng)常說(shuō)在Javascript語(yǔ)言中,函數(shù)是一等公民,它們本質(zhì)上是十分簡(jiǎn)單和過(guò)程化的。可以利用函數(shù),進(jìn)行一些簡(jiǎn)單的數(shù)據(jù)處理,return 結(jié)果,...
摘要:函數(shù)被轉(zhuǎn)化之后得到柯里化函數(shù),能夠處理的所有剩余參數(shù)。因此柯里化也被稱(chēng)為部分求值。那么函數(shù)的柯里化函數(shù)則可以如下因此下面的運(yùn)算方式是等價(jià)的。而這里對(duì)于函數(shù)參數(shù)的自由處理,正是柯里化的核心所在。額外知識(shí)補(bǔ)充無(wú)限參數(shù)的柯里化。 showImg(https://segmentfault.com/img/remote/1460000008493346); 柯里化是函數(shù)的一個(gè)比較高級(jí)的應(yīng)用,想要...
閱讀 1582·2021-11-25 09:43
閱讀 2486·2019-08-30 15:54
閱讀 2950·2019-08-30 15:53
閱讀 1099·2019-08-30 15:53
閱讀 757·2019-08-30 15:52
閱讀 2546·2019-08-26 13:36
閱讀 818·2019-08-26 12:16
閱讀 1220·2019-08-26 12:13