闭包与柯里化的小题目
2017-04-17 21:23
253 查看
题目
如何实现以下函数:add(2,5)//7 add(2)(5)//7
分析
凭直觉讲add函数的返回值有两种,一种是数值,一种是函数,根据参数来定要实现第二种效果的时候,返回值就是函数,那么如何把第一个参数传进返回函数中(就是闭包的应用),其实原理都很简单
似乎有点柯里化函数式编程的味道
Show Code
function add(){ let sum = 0; if(arguments.length > 1){ for(let i = 0;i<arguments.length;i++){ sum += Number(arguments[i])||0; } return sum; }else{ sum += arguments[0]; return function(b){return sum+b} } }
这里做了一下简单的参数控制,当参数很多的时候也是可以加的,O(∩_∩)O哈哈~,比如
add(1,2,3,4,5),但是如何实现
add(1)(2)(3)(4)(5)呢?
就知道你比别人多想一步,就是有没有办法把返回的函数也能变成值呢,有啊,重载
toString()吧,当一个对象转换成原始值时,先查看对象是否有valueOf方法,如果有并且返回值是一个原始值,那么直接返回这个值,否则没有valueOf或返回的不是原始值,那么调用toString方法,返回字符串表示。看完这个你基本就会了柯里化了,了解更多扩展阅读
function add(){ let sum = 0; if(arguments.length > 1){ for(let i = 0;i<arguments.length;i++){ sum += Number(arguments[i])||0; } return sum; }else{ sum += arguments[0]; let fn = function(b){return add(sum+b)} fn.toString = function(){return sum+''}; fn.valueOf = function(){return sum}; return fn; } }
One more Think
柯里化,把一批参数分多次传递这个操作叫curry.比如写个柯里化函数把下面这个函数转换成上面的效果function sum4(a,b,c,d){return a+b+c+d;}
代码如下:
var curry = function(final, arity) { var curried = function() { // this是每次的参数列表 // 每次slice()保证curry后的函数仍然是无状态的 var new_args = this.slice(); for(arg_key in arguments) { new_args.push(arguments[arg_key]); } if (new_args.length >= arity) { return final.apply(null, new_args); } else { return curried.bind(new_args); } }; return curried.bind([]); }; var sum4 = function(a,b,c,d) { return a+b+c+d; }; var curried = curry(sum4, sum4.length); console.log(curried(1,2,3)(4)); // -> 10 console.log(curried(1)(2,3)(4)); // -> 10
这有点让我想到之前的一个面试题,跟这个差不多,只不过跟
promise扯到一起了。问题就是如何把nodeCallbackStyle【function(err,args….)】转成promise,这个的确是这个很棒的问题,其实就是promisefy。本质就是个闭包传递。
function promisfy(func){ return function(){ var args = [].slice.call(arguments); return new promise((resolve,reject)=>{ function callback(err,data){ if(err){reject(err);} else{resolve(data);} } args.push(callback); func.apply(func,args); }) } }
相关文章推荐
- 通过经典题目来理解多种闭包实现方式
- 闭包题目
- 闭包-小题目
- 闭包题目
- [011]前端JS经典题目之闭包
- 闭包与柯里化
- scala 学习(十六)——闭包和柯里化
- 一道闭包题目的做题笔记
- js闭包面试题目
- 一道javascript面试题(闭包与函数柯里化)
- js闭包 一些题目
- 一道闭包题目的做题笔记
- js闭包相关题目
- 最新今日头条面试题目(js闭包、原型、继承、作用域)(2016)
- 理解运用JS的闭包、高阶函数、柯里化
- java函数式编程--柯里化(Currying),闭包
- 什么是闭包?请举例说明(面试题目)
- JS闭包以及具体题目2
- 作用域闭包、预解释和this关键字综合题目
- 通过经典题目来理解多种闭包实现方式