反柯里化主要是借用別人的函式,比如類陣列沒有push函式,但是可以借用push函式,.push()呼叫的時候,push裡面的this值是,但是arguments.push()是不行的,因為arguments沒有這個方法,那怎麼辦呢,反柯里化就是要修改裡面的this值,所謂的this泛化,讓this程式設計其他物件,從而達到借用的目的。以下是三個反科里化函式
文章內容借鑑於稍微做了些修改而已。
function uncurring()
function uncurring()
var push=aarray.prototype.push.uncurring();
var a={}
push(a,1,2,3)//object
這時候a成為了push函式裡的this值。
下面具體講一下這三個函式的工作原理,其實都是一樣的。反柯里化應用中,有幾個知識點事比較重要的,
1.首先是call函式的大致實現原理,當我們執行x.call(obj,1,2,3)的時候,到底是做了什麼?call的源**大概是這樣的:
function call()
}所以最後會在obj上增加一系列的屬性。反柯里化後返回的函式,執行該函式時,第乙個引數就是最後執行的那個借用函式裡使用的this值。
文章裡還提到了一下這個應用,就是對call進行反柯里化。下面來解析一下**。
var call = function.prototype.call.uncurrying();
/*返回的是function()*/
function $(id)
var demo = call($, document, 'demo');
其實執行的就是this(document,"demo")//this是call函式,並且這個call函式裡的this是$,
其實執行的就是$("demo")//$函式裡面的this是document,
其實執行的就是document.getelementbyid("demo")
*/console.log(demo);
文章還提到的乙個是對uncurring函式就行uncurring化。
var uncurrying = function.prototype.uncurrying.uncurrying();
返回的是function(),所以這時候就退化到了前面例子的情況。
*/var sq = map([1, 2, 3],
function(n) );
console.log(sq); // [1,4,9]
function uncurring() }
柯里化與反柯里化
柯里化,可以理解為提前接收部分引數,延遲執行,不立即輸出結果,而是返回乙個接受剩餘引數的函式。因為這樣的特性,也被稱為部分計算函式。柯里化,是乙個逐步接收引數的過程。在接下來的剖析中,你會深刻體會到這一點。反柯里化,是乙個泛型化的過程。它使得被反柯里化的函式,可以接收更多引數。目的是建立乙個更普適性...
柯里化與反柯里化
柯里化,可以理解為提前接收部分引數,延遲執行,不立即輸出結果,而是返回乙個接受剩餘引數的函式。因為這樣的特性,也被稱為部分計算函式。柯里化,是乙個逐步接收引數的過程。在接下來的剖析中,你會深刻體會到這一點。反柯里化,是乙個泛型化的過程。它使得被反柯里化的函式,可以接收更多引數。目的是建立乙個更普適性...
Scala柯里化和反柯里化
名詞解釋 在電腦科學中,柯里化 currying 是把接受多個引數的函式變換成接受乙個單一引數 最初函式的第乙個引數 的函式,並且返回接受餘下的引數且返回結果的新函式的技術。柯里化舉例說明 def curry1 a,b,c a a,f a,b c b c b b f a,b 這個函式的結果是乙個高階...