搞懂js函式柯里化

2021-10-06 23:32:29 字數 1907 閱讀 6809

柯里化(currying)是把接受多個引數的函式變換成接受乙個單一引數(最初函式的第乙個引數)的函式,並且返回接受餘下的引數且返回結果的新函式的技術。

簡單來說,以前寫乙個sum函式求兩數之和,呼叫時是sum(a,b),而柯里化之後的呼叫方式則變成了sum(a)(b)...

從呼叫方法可以看出,sum函式返回的一定還是乙個可被持續呼叫的函式,直到呼叫結束。因此js中函式柯里化的基本方法也是:使用閉包來返回乙個函式。

將函式柯里化的通用方式如下:

function curry(fn) 

}// 呼叫方式

var fncurry = curry(fn)

fncurry(1)(2)

如果我們要計算4個數之和,使用普通函式:

function sum(a,b,c,d)     

// 呼叫方式

sum(1,2,3,4) // 10

使用柯里化函式:

function curry(fn,...arg) 

return curry(fn, ...args)

}}var sumcurry = curry(sum)

sumcurry(1,2,3,4) // 10

sumcurry(1)(2)(3)(4) // 10

sumcurry(1,2,3)(4) // 10

sumcurry(1,2)(3,4) // 10

把柯里化函式和目標函式合併: 

function sumcurry(...arg)  

var _curry = function (...nextarg)

return sumcurry(...args)

}if(arg.length >= sum.length) else

}sumcurry(1,2,3,4) // 10

sumcurry(1)(2)(3)(4) // 10

sumcurry(1,2,3)(4) // 10

sumcurry(1,2)(3,4) // 10

上面的做法針對引數已知個數。如果是引數個數不確定呢?

普通函式:

function sum() )

}sum(1) // 1

sum(1,2) //3

sum(1,2,3) //6

對於不定參的函式柯里化來說,需要新增乙個判斷結束的方法呼叫。如多一層呼叫、呼叫valueof、tostring方法等。

幾乎所有的資料型別都擁有tostring方法和valueof方法,null除外。

valueof()會把資料型別轉換成原始型別,tostring()會把資料型別轉換成string型別。這裡注意:

正常情況下物件會先呼叫tostring方法,但有運算操作符的情況下會優先呼叫valueof方法,無法運算再呼叫tostring方法。

這裡把柯里化函式和目的函式sum合併了:

function sumcurry(...arg)     

return args.reduce((prve, cur) => )

}_curry.valueof = function () )

}return _curry

}sumcurry(1,2)() // 3

sumcurry(1)(2)(3).valueof() // 6

sumcurry(1,2,3)(4)() // 10

sumcurry(1,2)(3,4)(5).valueof() // 15

// 判斷返回值

sumcurry(1)(2)(3) == 6 // true

js函式柯里化

什麼是函式柯里化?在電腦科學中,柯里化 currying 是把接受多個引數的函式變換成接受乙個單一引數 最初函式的第乙個引數 的函式,並且返回接受餘下的引數且返回結果的新函式的技術。這個技術由 christopher strachey 以邏輯學家 haskell curry 命名的,儘管它是 mos...

js 函式柯里化

函式柯里化的主要目的就是為了減少函式傳參,同時將一些固定引數私有化。下面展示一段非常簡單計算圓面積的 來說明函式柯里化的原理 circle函式,接受半徑r和 function circle r,p 通過函式柯里化來簡化circle函式,只傳入半徑就能計算出面積 不管怎麼樣,是不會變的,因此我們將他寫...

js 函式柯里化

函式柯里化的主要目的就是為了減少函式傳參,同時將一些固定引數私有化。下面展示一段非常簡單計算圓面積的 來說明函式柯里化的原理 circle函式,接受半徑r和 function circle r,p 通過函式柯里化來簡化circle函式,只傳入半徑就能計算出面積 不管怎麼樣,是不會變的,因此我們將他寫...