摘要:題目發現一道有意思的面試題如何實現首先簡單分析一下,我們就能發現這是一個函數傳值次得到。簡單實現利用閉包,執行函數時一個匿名函數,用于最終返回結果。當然,這個方法有個明顯缺陷,就是如果函數變成,我們就又要手動嵌套一層。
題目
發現一道有意思的面試題:如何實現 add(1)(2)(3)=6 ?
首先簡單分析一下,我們就能發現這是一個函數傳值 return3次得到6 。
簡單實現function add(a) { return function (b) { return function (c) { return a + b + c; } } }
利用閉包,執行add函數時return一個匿名函數,用于最終返回結果。
當然,這個方法有個明顯缺陷,就是如果函數變成 add(1)(2)(3)(4) ,我們就又要手動嵌套一層。
分析有沒有什么辦法呢? 有!
我們先把這個問題簡化一下:
如何實現函數對自身的調用呢,如: add()()() ?
function add () { // 方法1:利用apply return function () { return add.apply(); } // 方法2: // return add; }
那么,問題就可以這么實現:
function add () { var args = Array.prototype.slice.call(arguments); console.log(args); var fn = function () { var fn_args = Array.prototype.slice.call(arguments); return add.apply(null, args.concat(fn_args)); }; return fn; }
至此, add 函數的多層嵌套以及所有參數,我們都拿到了,下面只需要把參數相加就可以了。
但我們不能直接相加,因為我們 add 函數 return add.apply() 返回的是函數, 因此即使相加,值我們也是拿不到的。
valueOf這里我們要用到 valueOf 方法。
valueOf 方法返回指定對象的原始值。
function add () { var args = Array.prototype.slice.call(arguments); var fn = function () { var fn_args = Array.prototype.slice.call(arguments); return add.apply(null, args.concat(fn_args)); }; fn.valueOf = function () { return args.reduce(function (a, b) { return a + b; }); }; return fn; }
搞定!現在這個方法不僅支持 add(1)(2)(3) 而且支持 add(1,2,3) 。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/99833.html
摘要:忍者秘籍一書中,對于柯里化的定義如下在一個函數中首先填充幾個參數然后再返回一個新函數的技術稱為柯里化。回到我們的題目本身,其實根據測試用例我們可以發現,函數的要求就是接受單一函數,例如但是與柯里化不同之處在于,柯里化返回的一個新函數。 歡迎大家再一次來到我的文章專欄:從面試題中我們能學到什么,各位同行小伙伴是否已經開始了悠閑的春節假期呢?在這里提前祝大家雞年大吉吧~哈哈,之前有人說...
摘要:原題如下寫一個方法,當使用下面的語法調用時,能正常工作這道題要考察的,就是對函數柯里化的理解。當參數只有一個的時候,進行柯里化的處理。這其實就是函數柯里化的簡單應用。 showImg(https://segmentfault.com/img/bVbopGm?w=620&h=350); 前言 這是前端面試題系列的第 6 篇,你可能錯過了前面的篇章,可以在這里找到: ES6 中箭頭函數的...
摘要:函數柯里化在函數式編程中,函數是一等公民。函數柯里化的主要作用和特點就是參數復用提前返回和延遲執行。可能在實際應用場景中,很少使用函數柯里化的解決方案,但是了解認識函數柯里化對自身的提升還是有幫助的。 最近在整理面試資源的時候,發現一道有意思的題目,所以就記錄下來。 題目 如何實現 multi(2)(3)(4)=24? 首先來分析下這道題,實現一個 multi 函數并依次傳入參數執行,...
摘要:如果你對函數式編程有一定了解,函數柯里化是不可或缺的,利用函數柯里化,可以在開發中非常優雅的處理復雜邏輯。同樣先看簡單版本的方法,以方法為例,代碼來自高級程序設計加強版實現上面函數,可以換成任何其他函數,經過函數處理,都可以轉成柯里化函數。 我們經常說在Javascript語言中,函數是一等公民,它們本質上是十分簡單和過程化的。可以利用函數,進行一些簡單的數據處理,return 結果,...
閱讀 3753·2021-10-13 09:39
閱讀 3804·2021-09-24 09:48
閱讀 1202·2021-09-01 10:30
閱讀 2533·2019-08-30 15:55
閱讀 1786·2019-08-29 16:39
閱讀 2304·2019-08-26 13:55
閱讀 3057·2019-08-26 12:23
閱讀 1643·2019-08-26 11:59