成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript 函數(shù)式編程技巧 - 反柯里化

zhjx922 / 2808人閱讀

摘要:作為函數(shù)式編程語言,帶來了很多語言上的有趣特性,比如柯里化和反柯里化。而反柯里化,從字面講,意義和用法跟函數(shù)柯里化相比正好相反,擴大適用范圍,創(chuàng)建一個應用范圍更廣的函數(shù)。

作為函數(shù)式編程語言,JS帶來了很多語言上的有趣特性,比如柯里化和反柯里化。

可以對照另外一篇介紹 JS 柯里化 的文章一起看~

1. 簡介

柯里化,是固定部分參數(shù),返回一個接受剩余參數(shù)的函數(shù),也稱為部分計算函數(shù),目的是為了縮小適用范圍,創(chuàng)建一個針對性更強的函數(shù)。核心思想是把多參數(shù)傳入的函數(shù)拆成單參數(shù)(或部分)函數(shù),內(nèi)部再返回調(diào)用下一個單參數(shù)(或部分)函數(shù),依次處理剩余的參數(shù)。

反柯里化,從字面講,意義和用法跟函數(shù)柯里化相比正好相反,擴大適用范圍,創(chuàng)建一個應用范圍更廣的函數(shù)。使本來只有特定對象才適用的方法,擴展到更多的對象。

2. 實現(xiàn)

先來看看反柯里化的通用實現(xiàn)吧~

Function.prototype.unCurrying = function() { const self = this return function(...rest) { return Function.prototype.call.apply(self, rest) } }

解釋下:

    為Function原型添加uncurrying方法,并在執(zhí)行的時候保存執(zhí)行unCurrying的方法到self

    借用apply把要借用的函數(shù)作為this環(huán)境賦給call,并傳入之后的形參作為參數(shù)執(zhí)行

還有一個實現(xiàn):

Function.prototype.unCurrying = function() { return this.call.bind(this) }

如果你覺得把函數(shù)放在Function.prototype上不太好,也可以這樣:

function unCurrying(fn) { return function(tar, ...argu) { return fn.apply(tar, argu) } } 3. 使用 3.1 簡單使用

unCurrying通用實現(xiàn)簡單的實用一下試試:

Function.prototype.unCurrying = function() { const self = this // 這里的self就是Array.prototype.push方法 return function(...rest) { // rest為傳入的兩層參數(shù)[[1,2,3],4] return Function.prototype.call.apply(self, rest) } } const push = Array.prototype.push.unCurrying() ~function(...rest) { // rest:[1,2,3] push(rest, 4) console.log(rest) // [1, 2, 3, 4] }(1, 2, 3) 3.2 借用其他方法

反柯里化其實反映的是一種思想,即擴大方法的適用范圍,仍然調(diào)用剛剛的通用unCurrying方法借用push方法:

const push = Array.prototype.push.unCurrying() const obj = { a: "嘻嘻" } push(obj, "呵呵", "哈哈", "嘿嘿") console.log(obj) // { "0": "呵呵", "1": "哈哈", "2": "嘿嘿", a: "嘻嘻", length: 3 }

相當于obj.push(...),obj不僅多了類似于數(shù)組一樣以數(shù)字作為索引的屬性,還多了個類似于數(shù)組的length屬性,讓引擎自動管理數(shù)組成員和length屬性;(文后有V8引擎實現(xiàn)push方法的源碼) 這樣一個數(shù)組的push方法就被借用出來,可以應用于任何其他對象了。

只要是方法,unCurrying就可以借用,call方法也可以:

var call = Function.prototype.call.unCurrying(); function $(id) { return this.getElementById(id); } call($, document, "demo") // #demo 元素

相當于document.$("demo"),成功的借用了call方法,當然可以把document改成你希望作為this綁定到$的任何對象,比如{ getElementById:T=>console.log(T+"呃") } // demo呃

3.3 借用自己

unCurrying本身也是方法,也可以借用自己...-。-

const unCurrying = Function.prototype.unCurrying.unCurrying() const map = unCurrying(Array.prototype.map) map({ 0: 4, 1: "a", 2: null, length: 3 }, n => n + n) // [8, "aa", 0]

神奇吧~

4. 總結(jié)

簡單說,函數(shù)柯里化就是對高階函數(shù)的降階處理,縮小適用范圍,創(chuàng)建一個針對性更強的函數(shù)。舉栗子:

function(arg1,arg2) // => function(arg1)(arg2) function(arg1,arg2,arg3) // => function(arg1)(arg2)(arg3) function(arg1,arg2,arg3,arg4) // => function(arg1)(arg2)(arg3)(arg4) function(arg1,arg2,…,argn) // => function(arg1)(arg2)…(argn)

而反柯里化就是反過來,增加適用范圍,讓方法使用場景更大。使用unCurrying, 可以把原生方法借出來,讓任何對象擁有原生對象的方法。舉個栗子:

obj.func(arg1, arg2) // => func(obj, arg1, arg2)

也可以這樣理解: 柯里化是在運算前提前傳參,可以傳遞多個參數(shù); 反柯里化是延遲傳參,在運算時把原來已經(jīng)固定的參數(shù)或者this上下文等當作參數(shù)延遲到未來傳遞。


附:

V8引擎中Array.prototype.push方法源碼實現(xiàn):

function ArrayPush() { var n = TO_UINT32(this.length); var m = %_ArgumentsLength(); for (var i = 0; i < m; i++) { this[i + n] = %_Arguments(i); // 屬性拷貝 this.length = n + m; // 修正length return this.length; } }

網(wǎng)上的帖子大多深淺不一,甚至有些前后矛盾,在下的文章都是學習過程中的總結(jié),如果發(fā)現(xiàn)錯誤,歡迎留言指出~

參考:

    JS 柯里化

    前端開發(fā)者進階之函數(shù)反柯里化unCurrying

    JavaScript中有趣的反柯里化

    js柯里化適用場景,優(yōu)缺點分別是什么,還有個反柯里化?

    JS進階篇--JS中的反柯里化( uncurrying)

PS:歡迎大家關(guān)注我的公眾號【前端下午茶】,一起加油吧~

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/6745.html

相關(guān)文章

  • 高階函數(shù)應用 —— 柯里柯里

    摘要:柯里化通用式上面的柯里化函數(shù)沒涉及到高階函數(shù),也不具備通用性,無法轉(zhuǎn)換形參個數(shù)任意或未知的函數(shù),我們接下來封裝一個通用的柯里化轉(zhuǎn)換函數(shù),可以將任意函數(shù)轉(zhuǎn)換成柯里化。 showImg(https://segmentfault.com/img/remote/1460000018998373); 閱讀原文 前言 在 JavaScript 中,柯里化和反柯里化是高階函數(shù)的一種應用,在這之前...

    wyk1184 評論0 收藏0
  • JavaScript 函數(shù)編程技巧 - 柯里

    摘要:作為函數(shù)式編程語言,帶來了很多語言上的有趣特性,比如柯里化和反柯里化。在一些函數(shù)式編程語言中,會定義一個特殊的占位變量。個人理解不知道對不對延遲執(zhí)行柯里化的另一個應用場景是延遲執(zhí)行。不斷的柯里化,累積傳入的參數(shù),最后執(zhí)行。作為函數(shù)式編程語言,JS帶來了很多語言上的有趣特性,比如柯里化和反柯里化。 這里可以對照另外一篇介紹 JS 反柯里化 的文章一起看~ 1. 簡介 柯里化(Currying)...

    edgardeng 評論0 收藏0
  • JS進階篇--JS中的柯里( uncurrying)

    摘要:最后,我們反過來看,其實反柯里化相當于把原來的形式,轉(zhuǎn)換成了,使得的使用范圍泛化了。更抽象地表達,反柯里化,使得原來調(diào)用,可以轉(zhuǎn)成形式的調(diào)用。 反柯里化 相反,反柯里化的作用在與擴大函數(shù)的適用性,使本來作為特定對象所擁有的功能的函數(shù)可以被任意對象所用.即把如下給定的函數(shù)簽名, obj.func(arg1, arg2) 轉(zhuǎn)化成一個函數(shù)形式,簽名如下: func(obj, arg1, ar...

    LdhAndroid 評論0 收藏0
  • 翻譯連載 | JavaScript 輕量級函數(shù)編程-第3章:管理函數(shù)的輸入 |《你不知道的JS》姊

    摘要:但是,對函數(shù)式編程而言,這個行為的重要性是毋庸置疑的。關(guān)于該模式更正式的說法是偏函數(shù)嚴格來講是一個減少函數(shù)參數(shù)個數(shù)的過程這里的參數(shù)個數(shù)指的是希望傳入的形參的數(shù)量。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個流淌著滬江血液的純粹工程:認真,是 HTML 最堅實的梁柱;分享,是...

    xiaowugui666 評論0 收藏0
  • JS中的柯里

    摘要:作為函數(shù)式編程語言,帶來了很多語言上的有趣特性,比如柯里化和反柯里化。個人理解不知道對不對延遲執(zhí)行柯里化的另一個應用場景是延遲執(zhí)行。不斷的柯里化,累積傳入的參數(shù),最后執(zhí)行。 作為函數(shù)式編程語言,JS帶來了很多語言上的有趣特性,比如柯里化和反柯里化。 這里可以對照另外一篇介紹 JS 反柯里化 的文章一起看~ 1. 簡介 柯里化(Currying),又稱部分求值(Partial Evalu...

    Hancock_Xu 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<