柯里化與反柯里化

2022-02-21 15:40:24 字數 3209 閱讀 8685

柯里化,可以理解為提前接收部分引數,延遲執行,不立即輸出結果,而是返回乙個接受剩餘引數的函式。因為這樣的特性,也被稱為部分計算函式。柯里化,是乙個逐步接收引數的過程。在接下來的剖析中,你會深刻體會到這一點。

反柯里化,是乙個泛型化的過程。它使得被反柯里化的函式,可以接收更多引數。目的是建立乙個更普適性的函式,可以被不同的物件使用。有鳩佔鵲巢的效果。

實現add(1)(2, 3)(4)() = 10的效果

依題意,有兩個關鍵點要注意:

完整**如下:

function currying(fn)else

} }var add = currying(function()

return sum;

});

由於是延遲計算結果,所以要對引數進行記憶。

這裡的實現方式是採用閉包。

function currying(fn)

} }

當執行var add = currying(...)時,add變數已經指向了next方法。此時,allargsnext方法內部有引用到,所以不能被gc**。也就是說,allargs在該賦值語句執行後,一直存在,形成了閉包。

依靠這個特性,只要把接收的引數,不斷放入allargs變數進行儲存即可。

所以,當arguments.length > 0時,就可以將接收的新引數,放到allargs中。

最後返回next函式指標,形成鏈式呼叫。

function currying(fn)else

} }

柯里化,在這個例子中可以看出很明顯的行為規範:

實現add(1)(2, 3)(4)(5) = 15的效果。

很多人這裡就犯嘀咕了:我怎麼知道執行的時機?

其實,這裡有個忍者技藝:valueoftostring

js在獲取當前變數值的時候,會根據語境,隱式呼叫valueoftostring方法進行獲取需要的值。

那麼,實現起來就很簡單了。

function currying(fn)

// 字元型別

next.tostring = function();

// 數值型別

next.valueof = function()

return next;

}var add = currying(function()

return sum;

});

有以下輕提示類。現在想要單獨使用其show方法,輸出新物件obj中的內容。

// 輕提示

function toast(option)

toast.prototype =

};// 新物件

var obj = ;

用反柯里化的方式,可以這麼做

function uncurrying(fn)

}var objshow = uncurrying(toast.prototype.show);

objshow(obj); // 輸出"新物件"

function.prototype.uncurrying = function()

}// 使用

var objshow = toast.prototype.show.uncurrying();

objshow(obj);

2)callfunction(arguments)的解析

call方法,第乙個引數,是用來指定this的。所以callfunction(arguments)->callfunction(arguments[0], arguments[1-n])

由此可以得出,反柯里化後,第乙個引數,是用來指定this指向的。

var fn = function(){};

var val = 1;

if(object.prototype.tostring.call(fn) == '[object function]') is function.`);

}if(object.prototype.tostring.call(val) == '[object number]') is number.`);

}

上述**,用反柯里化,可以這麼寫:

var fn = function(){};

var val = 1;

var tostring = object.prototype.tostring.uncurrying();

if(tostring(fn) == '[object function]') is function.`);

}if(tostring(val) == '[object number]') is number.`);

}

function nodelisten(node, eventname), false);

}}var bodyclicklisten = nodelisten(document.body, 'click');

bodyclicklisten(function());

bodyclicklisten(function());

使用柯里化,優化監聽dom節點事件。addeventlistener三個引數不用每次都寫。

其實,反柯里化和泛型方法一樣,只是理念上有一些不同而已。理解這種思維即可。

柯里化與反柯里化

柯里化,可以理解為提前接收部分引數,延遲執行,不立即輸出結果,而是返回乙個接受剩餘引數的函式。因為這樣的特性,也被稱為部分計算函式。柯里化,是乙個逐步接收引數的過程。在接下來的剖析中,你會深刻體會到這一點。反柯里化,是乙個泛型化的過程。它使得被反柯里化的函式,可以接收更多引數。目的是建立乙個更普適性...

Scala柯里化和反柯里化

名詞解釋 在電腦科學中,柯里化 currying 是把接受多個引數的函式變換成接受乙個單一引數 最初函式的第乙個引數 的函式,並且返回接受餘下的引數且返回結果的新函式的技術。柯里化舉例說明 def curry1 a,b,c a a,f a,b c b c b b f a,b 這個函式的結果是乙個高階...

高階函式 函式柯里化與反柯里化

一 函式柯里化 currying 是把接受多個引數的函式變換成接受乙個單一引數 最初函式的第乙個引數 的函式,並且返回接受餘下的引數而且返回結果的新函式的技術。例 記錄程式設計師乙個月的加班總時間,那麼好,我們首先要做的是記錄程式設計師每天加班的時間,然後把乙個月中每天的加班的時間相加,就得到了乙個...