經常在面試中會有這樣的面試題:寫乙個mul函式,使用方法如下:
console.loe(mul(2)(3)(4)) //output: 24
console.loe(mul(4)(3)(4)) //output: 48
實現方法:使用閉包
function mul(a)
}}
上面實現方法存在兩方面缺陷
更好的解決方案:函式柯里化的實現
1、函式柯里化指的是能夠接收多個引數的函式轉化為接收單一引數的函式,並且返回接收餘下引數且返回結果的新函式的技術
2、作用和特點:引數復用,提前返回,延遲執行
以題為例
函式柯里化指的是能夠接收多個引數function multifn(a, b, c)的函式通過函式合理化var multi = curry(multifn)轉化為接收單一引數multi(1)(2)(3)的函式
實現curry函式
function curry(fn, args) else
}}
呼叫curry函式
function multifn(a, b, c)
var multi = curry(multifn);
multi(2)(3)(4);
以上函式只會接收3個引數,如果有n個引數,針對面試題,需要優化**
function multi()
fn.tostring = function() )
}return fn;
}// 呼叫**
multi(2)(3)(4) //24
multi(2)(3)(4)(5) //120
multi(1)(2)(3)(4)(5) //120
compose 函式的作用就是組合函式,將函式串聯起來執行,乙個函式的輸出結果是另乙個函式的輸入引數,一旦第 1 個函式開始執行,就會像多公尺諾骨牌一樣推導執行了。
使用 compose 要注意以下 3 點:
以上。。。
參考:【從一道面試題認識函式柯里化】
【詳解js函式柯里化】
【js函式柯里化(curry)和函式合成(compose)】
一道柯里化面試題
這是一道朋友在群裡發的一道題,我之前不是很懂柯里化,就自己試著寫了一下,不知道算不算柯里化,望指教 下面是題目 function curry 寫好之後一下 可以正常執行輸入正確 function add a,b,c let addex curry add console.log addex 1,2,...
從面試題手寫bind函式分析函式柯里化
這不是針對js語言,大多數語言都支援該特性 請看乙個簡單的栗子 function add x y console.log add 3,7 10如果現在有乙個需求,add函式呼叫一次只能加乙個數,需要呼叫兩次才能出結果,這裡就需要用到函式柯里化 想要了解函式柯里化最好能先對閉包有乙個深入的了解 fun...
函式柯里化
在電腦科學中,柯里化 currying 是把接受多個引數的函式變換成接受乙個單一引數 最初函式的第乙個引數 的函式,並且返回接受餘下的引數且返回結果的新函式的技術。在直覺上,柯里化聲稱 如果你固定某些引數,你將得到接受餘下引數的乙個函式 柯里化實現的原理 在函式式程式語言中,將函式可以當做物件傳遞呼...