国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

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

zhjx922 / 2807人閱讀

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

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

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

1. 簡(jiǎn)介

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

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

2. 實(shí)現(xiàn)

先來(lái)看看反柯里化的通用實(shí)現(xiàn)吧~

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

解釋下:

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

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

還有一個(gè)實(shí)現(xiàn):

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

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

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

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

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 借用其他方法

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

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

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

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

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

相當(dāng)于document.$("demo"),成功的借用了call方法,當(dāng)然可以把document改成你希望作為this綁定到$的任何對(duì)象,比如{ 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é)

簡(jiǎn)單說(shuō),函數(shù)柯里化就是對(duì)高階函數(shù)的降階處理,縮小適用范圍,創(chuàng)建一個(gè)針對(duì)性更強(qiá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)

而反柯里化就是反過(guò)來(lái),增加適用范圍,讓方法使用場(chǎng)景更大。使用unCurrying, 可以把原生方法借出來(lái),讓任何對(duì)象擁有原生對(duì)象的方法。舉個(gè)栗子:

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

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


附:

V8引擎中Array.prototype.push方法源碼實(shí)現(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)上的帖子大多深淺不一,甚至有些前后矛盾,在下的文章都是學(xué)習(xí)過(guò)程中的總結(jié),如果發(fā)現(xiàn)錯(cuò)誤,歡迎留言指出~

參考:

    JS 柯里化

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

    JavaScript中有趣的反柯里化

    js柯里化適用場(chǎng)景,優(yōu)缺點(diǎn)分別是什么,還有個(gè)反柯里化?

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

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/6745.html

相關(guān)文章

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

    摘要:柯里化通用式上面的柯里化函數(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)用,在這之前...

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

    摘要:作為函數(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)...

    edgardeng 評(píng)論0 收藏0
  • JS進(jìn)階篇--JS中的柯里( uncurrying)

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

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

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

    xiaowugui666 評(píng)論0 收藏0
  • JS中的柯里

    摘要:作為函數(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...

    Hancock_Xu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<