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

資訊專欄INFORMATION COLUMN

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

LdhAndroid / 783人閱讀

摘要:最后,我們反過來看,其實(shí)反柯里化相當(dāng)于把原來的形式,轉(zhuǎn)換成了,使得的使用范圍泛化了。更抽象地表達(dá),反柯里化,使得原來調(diào)用,可以轉(zhuǎn)成形式的調(diào)用。

反柯里化

相反,反柯里化的作用在與擴(kuò)大函數(shù)的適用性,使本來作為特定對(duì)象所擁有的功能的函數(shù)可以被任意對(duì)象所用.
即把如下給定的函數(shù)簽名,

obj.func(arg1, arg2)

轉(zhuǎn)化成一個(gè)函數(shù)形式,簽名如下:

func(obj, arg1, arg2)

這就是 反柯里化的形式化描述。

例如,下面的一個(gè)簡(jiǎn)單實(shí)現(xiàn):

Function.prototype.uncurrying = function() {
    var that = this;
    return function() {
        return Function.prototype.call.apply(that, arguments);
    }
};

function sayHi () {
    return "Hello " + this.value +" "+[].slice.call(arguments);
}
var sayHiuncurrying=sayHi.uncurrying();
console.log(sayHiuncurrying({value:"world"},"hahaha"));

解釋:

uncurrying是定義在Function的prototype上的方法,因此對(duì)所有的函數(shù)都可以使用此方法。調(diào)用時(shí)候:sayHiuncurrying=sayHi.uncurrying(),所以u(píng)ncurrying中的 this 指向的是 sayHi 函數(shù); (一般原型方法中的 this 不是指向原型對(duì)象prototype,而是指向調(diào)用對(duì)象,在這里調(diào)用對(duì)象是另一個(gè)函數(shù),在javascript中函數(shù)也是對(duì)象)

call.apply(that, arguments) 把 that 設(shè)置為 call 方法的上下文,然后將 arguments 傳給 call方法,前文的例子,that 實(shí)際指向 sayHi,所以調(diào)用 sayHiuncurrying(arg1, arg2, ...) 相當(dāng)于 sayHi.call(arg1, arg2, ...);

sayHi.call(arg1, arg2, ...), call 函數(shù)把 arg1 當(dāng)做 sayHi的上下文,然后把 arg2,... 等剩下的參數(shù)傳給sayHi,因此最后相當(dāng)于 arg1.sayHi(arg2,...);

因此,這相當(dāng)于 sayHiuncurrying(obj,args) 等于 obj.sayHi(args)。

最后,我們反過來看,其實(shí)反柯里化相當(dāng)于把原來 sayHi(args) 的形式,轉(zhuǎn)換成了 sayHiuncurrying(obj,args),使得sayHi的使用范圍泛化了。 更抽象地表達(dá), uncurryinging反柯里化,使得原來 x.y(z) 調(diào)用,可以轉(zhuǎn)成 y(x",z) 形式的調(diào)用 。 假設(shè)x" 為x或者其他對(duì)象,這就擴(kuò)大了函數(shù)的使用范圍。

通用反柯里化函數(shù)

上面例子中把uncurrying寫進(jìn)了prototype,這不太好,我們其實(shí)可以把 uncurrying 多帶帶封裝成一個(gè)函數(shù);

var uncurrying= function (fn) {
    return function () {
        var args=[].slice.call(arguments,1);
        return fn.apply(arguments[0],args);        
    }    
};

上面這個(gè)函數(shù)很清晰直接。
使用時(shí) 調(diào)用 uncurrying 并傳入一個(gè)現(xiàn)有函數(shù) fn, 反柯里化函數(shù)會(huì)返回一個(gè)新函數(shù),該新函數(shù)接受的第一個(gè)實(shí)參將綁定為 fn 中 this的上下文,其他參數(shù)將傳遞給 fn 作為參數(shù)。

所以,對(duì)反柯里化更通俗的解釋可以是 函數(shù)的借用,是函數(shù)能夠接受處理其他對(duì)象,通過借用泛化、擴(kuò)大了函數(shù)的使用范圍。

所以 uncurrying更常見的用法是對(duì) Javascript 內(nèi)置的其他方法的 借調(diào) 而不用自己都去實(shí)現(xiàn)一遍。

文字描述比較繞,還是繼續(xù)看代碼:

var test="a,b,c";
console.log(test.split(","));

var split=uncurrying(String.prototype.split);   //[ "a", "b", "c" ]
console.log(split(test,","));                   //[ "a", "b", "c" ]

split=uncurrying(String.prototype.split) 給 uncurrying 傳入一個(gè)具體的fn,即String.prototype.split ,split 函數(shù)就具有了 String.prototype.split 的功能,函數(shù)調(diào)用 split(test,",") 時(shí),傳入的第一個(gè)參數(shù)為 split 執(zhí)行的上下文,剩下的參數(shù)相當(dāng)于傳給原 String.prototype.split 函數(shù)。

再看一個(gè)例子:

var $ = {};
console.log($.push);                          // undefined
var pushUncurrying = uncurrying(Array.prototype.push);
$.push = function (obj) {
    pushUncurrying(this,obj);
};
$.push("first");
console.log($.length);                        // 1
console.log($[0]);                            // first
console.log($.hasOwnProperty("length"));      // true

這里模仿了一個(gè)“類似jquery庫” 實(shí)現(xiàn)時(shí)借用 Array 的 push 方法。 我們知道對(duì)象是沒有 push 方法的,所以 console.log(obj.push) 返回 undefined,可以借用Array 來處理 push,由原生的數(shù)組方法(js引擎)來維護(hù) 偽數(shù)組對(duì)象的 length 屬性和數(shù)組成員。

同樣的道理,我們還可以繼續(xù)有:

var indexof=uncurrying(Array.prototype.indexOf);
$.indexOf = function (obj) {
    return indexof(this,obj);
};
$.push("second");
console.log($.indexOf("first"));              // 0
console.log($.indexOf("second"));             // 1
console.log($.indexOf("third"));              // -1

例如我們?cè)趯?shí)現(xiàn)自己的類庫時(shí),有些方法如果有些方法和原生的類似,那么可以通過 uncurrying 借用原生方法。

我們還可以把 Function.prototype.call/apply 方法 uncurring,例如:

var call= uncurrying(Function.prototype.call);
var fn= function (str) {
    console.log(this.value+str);
};
var obj={value:"Foo "};
call(fn, obj,"Bar!");                       // Foo Bar!

這樣可以非常靈活地把函數(shù)也當(dāng)做一個(gè)普通“數(shù)據(jù)”來使用,有函數(shù)式編程的趕腳,在一些類庫中經(jīng)常能看到這樣的用法。

通用 uncurrying 函數(shù)的進(jìn)擊

上面的 uncurrying 函數(shù)是比較符合思維習(xí)慣容易理解的版本,接下來一路進(jìn)擊,看幾個(gè)其他版本:

首先,如果B格高一點(diǎn),uncurrying 也可能寫成這樣:

var uncurrying= function (fn) {
    return function () {
        var context=[].shift.call(arguments);
        return fn.apply(context,arguments);
    }
};

當(dāng)然如果還需要再提升B格,那么還可以是這樣:

var uncurrying= function (fn) {
    return function () {        
        return Function.prototype.call.apply(fn,arguments);
    }
};
參考地址

淺析 JavaScript 中的 函數(shù) uncurrying 反柯里化

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

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

相關(guān)文章

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

    摘要:作為函數(shù)式編程語言,帶來了很多語言上的有趣特性,比如柯里化和反柯里化。而反柯里化,從字面講,意義和用法跟函數(shù)柯里化相比正好相反,擴(kuò)大適用范圍,創(chuàng)建一個(gè)應(yīng)用范圍更廣的函數(shù)。作為函數(shù)式編程語言,JS帶來了很多語言上的有趣特性,比如柯里化和反柯里化。 可以對(duì)照另外一篇介紹 JS 柯里化 的文章一起看~ 1. 簡(jiǎn)介 柯里化,是固定部分參數(shù),返回一個(gè)接受剩余參數(shù)的函數(shù),也稱為部分計(jì)算函數(shù),目的是為了縮...

    zhjx922 評(píng)論0 收藏0
  • 關(guān)于js中的柯里(Currying)與反柯里Uncurrying

    摘要:今天了解到一個(gè)新名詞柯里化,研究一番后總結(jié)如下一柯里化定義把接受多個(gè)參數(shù)的函數(shù)變換成接受一個(gè)單一參數(shù)最初函數(shù)的第一個(gè)參數(shù)的函數(shù),并且返回接受余下的參數(shù)且返回結(jié)果的新函數(shù)的技術(shù)。如果使用反柯里化,則可以這樣寫震驚某前端只會(huì),竟月入百萬。。。 今天了解到一個(gè)新名詞:柯里化,研究一番后總結(jié)如下: 一· 柯里化 定義 把接受多個(gè)參數(shù)的函數(shù)變換成接受一個(gè)單一參數(shù)(最初函數(shù)的第一個(gè)參數(shù))的函數(shù),并...

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

    摘要:但是,對(duì)函數(shù)式編程而言,這個(gè)行為的重要性是毋庸置疑的。關(guān)于該模式更正式的說法是偏函數(shù)嚴(yán)格來講是一個(gè)減少函數(shù)參數(shù)個(gè)數(shù)的過程這里的參數(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進(jìn)階--JS中的柯里(currying)

    摘要:何為化柯里化化來源與數(shù)學(xué)家的名字編程語言也是以他的名字命名。因此柯里化的過程是逐步傳參,逐步縮小函數(shù)的適用范圍,逐步求解的過程。當(dāng)在多次調(diào)用同一個(gè)函數(shù),并且傳遞的參數(shù)絕大多數(shù)是相同的,那么該函數(shù)可能是一個(gè)很好的柯里化候選。 何為Curry化/柯里化? curry化來源與數(shù)學(xué)家 Haskell Curry的名字 (編程語言 Haskell也是以他的名字命名)。 柯里化通常也稱部分求值,其...

    young.li 評(píng)論0 收藏0
  • JavaScript函數(shù)柯里

    摘要:函數(shù)柯里化的對(duì)偶是,一種使用匿名單參數(shù)函數(shù)來實(shí)現(xiàn)多參數(shù)函數(shù)的方法。這是基于的富應(yīng)用開發(fā)的方法實(shí)現(xiàn)反柯里化可能遇到這種情況拿到一個(gè)柯里化后的函數(shù),卻想要它柯里化之前的版本,這本質(zhì)上就是想將類似的函數(shù)變回類似的函數(shù)。 什么是柯里化? 官方的說法 在計(jì)算機(jī)科學(xué)中,柯里化(英語:Currying),又譯為卡瑞化或加里化,是把接受多個(gè)參數(shù)的函數(shù)變換成接受一個(gè)單一參數(shù)(最初函數(shù)的第一個(gè)參數(shù))的函數(shù)...

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

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

0條評(píng)論

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