柯里化,可以理解為提前接收部分引數,延遲執行,不立即輸出結果,而是返回乙個接受剩餘引數的函式。因為這樣的特性,也被稱為部分計算函式。柯里化,是乙個逐步接收引數的過程。在接下來的剖析中,你會深刻體會到這一點。
反柯里化,是乙個泛型化的過程。它使得被反柯里化的函式,可以接收更多引數。目的是建立乙個更普適性的函式,可以被不同的物件使用。有鳩佔鵲巢的效果。實現
add(1)(2, 3)(4)() = 10
的效果
依題意,有兩個關鍵點要注意:完整**如下:
function currying(fn)else
} }var add = currying(function()
return sum;
});
由於是延遲計算結果,所以要對引數進行記憶。
這裡的實現方式是採用閉包。
function currying(fn)
} }
當執行var add = currying(...)
時,add
變數已經指向了next
方法。此時,allargs
在next
方法內部有引用到,所以不能被gc**。也就是說,allargs
在該賦值語句執行後,一直存在,形成了閉包。
依靠這個特性,只要把接收的引數,不斷放入allargs
變數進行儲存即可。
所以,當arguments.length > 0
時,就可以將接收的新引數,放到allargs
中。
最後返回next
函式指標,形成鏈式呼叫。
function currying(fn)else
} }
柯里化,在這個例子中可以看出很明顯的行為規範:
實現add(1)(2, 3)(4)(5) = 15
的效果。
很多人這裡就犯嘀咕了:我怎麼知道執行的時機?
其實,這裡有個忍者技藝:valueof
和tostring
。
js在獲取當前變數值的時候,會根據語境,隱式呼叫valueof
和tostring
方法進行獲取需要的值。
那麼,實現起來就很簡單了。
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 是把接受多個引數的函式變換成接受乙個單一引數 最初函式的第乙個引數 的函式,並且返回接受餘下的引數而且返回結果的新函式的技術。例 記錄程式設計師乙個月的加班總時間,那麼好,我們首先要做的是記錄程式設計師每天加班的時間,然後把乙個月中每天的加班的時間相加,就得到了乙個...