博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
柯里化
阅读量:6848 次
发布时间:2019-06-26

本文共 1620 字,大约阅读时间需要 5 分钟。

 一、柯里化

柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

例如这样:

//柯里化前function add(a, b) {    return a + b;} add(10, 2) // 12//柯里化后var add = function(a) {    return function(b) {        return a + b;    };};var addTen = add(10);addTen(2); // 12

二、利用柯里化实现累加器

function fn(){    var numList = [].slice.call(arguments);    var _fn = function(){        var innerArguments = [].slice.call(arguments);        numList = numList.concat(innerArguments);        return _fn;    }    _fn.valueOf = function(){        return numList.reduce(function(num1, num2){            return num1 + num2;        });    }    return _fn;}console.log(fn(1)(2)(3));

 这段代码初看可能不太好理解,这里我们将它拆分一下:

arguments对象

戳,介绍的特别详细。

每一个js函数内部都有arguments,它代表传入的参数数组。arguments 是一个类数组对象。可以用下面的语句将arguments转化成数组对象:

var numList = [].slice.call(arguments); //将arguments转化成数组对象

还有常用的:[].slice.call(arguments, 1) 返回的是arguments数组从1号位开始的片段。用来获取arguments里除了第一项以外的其他所有选项。

valueOf() 方法   

返回 Boolean 对象的原始值:

这里也可以使用添加 toString() 的方式实现这一功能,与 valueOf() 做法一致。

reduce()方法

接收一个函数作为累加器。语法:

array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

使用范例:

var numbers = [65, 44, 12, 4];function getSum(total, num) {    return total + num;}function myFunction(item) {    document.getElementById("demo").innerHTML = numbers.reduce(getSum);}

递归

 可以看我的另一篇博客:

思路总结

首先若是想要实现 fn()() 这种调用方式的函数,则在 fn 函数体内一定也会返回一个函数。若是想要实现 fn()()()... 不定次数的调用,则意味着每一层的返回值均为一个函数,这就需要使用类似递归的方式去实现。在函数调用的最后一层,这个返回值应该是一个值而非函数,这里则需要使用 valueOf 这一方法。使用内置对象 arguments对函数中所传入的参数获取,arguments 不是数组,而是对象,将其转换为数组。使用数组的reduce 方法实现求和。

 

 

 

 

学习并感谢:

1、

2、

3、

 

转载于:https://www.cnblogs.com/PeriHe/p/8856843.html

你可能感兴趣的文章