一道javascript面试题(闭包与函数柯里化)
2017-05-15 23:06
288 查看
要求写一个函数add(),分别实现能如下效果:
针对(1)和(2),有两种思路实现:纯闭包思路和函数柯里化思路。
一、闭包思路
(1)的解决方案(闭包实现)
(2)的解决方案
二、函数柯里化的思路
通俗的理解,由于函数柯里化具有这样的特性:它能够"积累"函数的参数(不管是foo(1,2,3)还是foo(1)(2)(3)这种链式形式)),并且延迟执行。可以将多个参数积累到一个数组中,在最后一步执行求和。
柯里化通用形式:
(2)的解决方案:
针对问题(3):
(1)console.log(add(1)(2)(3)(4)());//10 (2)console.log(add(1,2)(3,4)());//10 (3)console.log(add(1,2)(3,4));//10
针对(1)和(2),有两种思路实现:纯闭包思路和函数柯里化思路。
一、闭包思路
(1)的解决方案(闭包实现)
function add(arg) { // body... let sum = 0; sum+=arg; return function (tmarg) { // body... if (arguments.length == 0) { return sum; }else{ sum+=tmarg; return arguments.callee; } } }
(2)的解决方案
function add(arg) { // body... let sum = 0; sum = Array.prototype.slice.call(arguments).reduce((a,b) => {return a+b;},sum); return function (tmarg) { // body... if (arguments.length == 0) { return sum; }else{ sum = Array.prototype.slice.call(arguments).reduce((a,b) => {return a+b;},sum); return arguments.callee; } } }
二、函数柯里化的思路
通俗的理解,由于函数柯里化具有这样的特性:它能够"积累"函数的参数(不管是foo(1,2,3)还是foo(1)(2)(3)这种链式形式)),并且延迟执行。可以将多个参数积累到一个数组中,在最后一步执行求和。
柯里化通用形式:
function curry(fn) { // body... var args = Array.prototype.slice.call(arguments,1); return function () { // body... var innerArgs = Array.prototype.slice.call(arguments); var finalArgs = args.concat(innerArgs); console.log(finalArgs); return fn.apply(null,finalArgs); }; }
(2)的解决方案:
function add() { let sum = 0; var _args = Array.prototype.slice.call(arguments); var tmpf = function(){ if(arguments.length === 0) { sum = _args.reduce((a,b) => {return a + b;},sum); } _args.push.apply(_args,[].slice.call(arguments)); return tmpf; } }
针对问题(3):
function add(arg) { // body... let sum = 0; sum = Array.prototype.slice.call(arguments).reduce((a,b) => {return a+b;},sum); var tmpf = function (tmarg) { // body... if (arguments.length == 0) { return sum; }else{ sum = Array.prototype.slice.call(arguments).reduce((a,b) => {return a+b;},sum); return tmpf; } }; tmpf.toString = tmpf.valueOf = function () { // body... return sum; } return tmpf; }
相关文章推荐
- JavaScript一道经典闭包面试题
- 从javascript一道闭包面试题说开去
- 一道javascript面试题
- JavaScript中匿名函数,函数直接量和闭包
- javascript中运用闭包和自执行函数解决大量的全局变量问题
- [笔记]一道C语言面试题:实现 itoa() 函数
- 一道简单的面试题(求较小的值,不能用 比较运算符 if-else ?: while for 内嵌汇编 递归 第三方函数)(zt)
- (转载)JavaScript中匿名函数,函数直接量和闭包
- 一道Javascript面试题,去除数组中的重复数字,大家看看我的做法是否正确
- (转)JavaScript中的匿名函数及函数的闭包
- JavaScript 闭包在封装函数时的简单分析
- javascript核心知识整理之一:函数闭包
- JavaScript中匿名函数,函数直接量和闭包(转)
- JavaScript 闭包在封装函数时的简单分析
- (转载)JavaScript中匿名函数,函数直接量和闭包
- javascript中运用闭包和自执行函数解决大量的全局变量问题
- javascript之函数作用域和闭包[function scope and closure]
- JavaScript中的匿名函数及函数的闭包
- JavaScript中匿名函数,函数直接量和闭包(转)
- 一道JavaScript面试题(setTimeout)