使用函数处理数组 高阶函数 js

函数式编程
和lisp这种纯粹的函数式编程不一样,js可以实现其为函数式编程

使用函数处理数组

计算一个数组的平均值

// 定义一个用于计算和的函数
var sum = function(x, y){return x + y;};

// 初始化将要处理的数据
var data = [23, 34, 324, 34, 45, 123, 56, 23];
var mean = data.reduce(sum) / data.length;

查看一下这个值

mean;
82.75

reduce() 方法为数组的注入

高阶函数

操作函数的函数,接受一个或多个函数作为参数,并返回一个新函数

agrements 所有非箭头函数的局部变量,使用agreements对象在函数中引用函数的参数,对象包含传递给该函数的每个参数的条目,并返回一个数组

function a(){console.log(arguments)};
a(3,24,54,45);
Arguments
​
0: 31: 242: 543: 45
​
callee: function a()length: 4
​
Symbol(Symbol.iterator): function values()
​
<prototype>: Object { … }
debugger eval code:1:14
undefined

this指代调用这个函数的对象

下方是关于every方法的使用示例,因为下方要使用every方法(注,这个方法每个函数都具有)

> function a(number, index){return number > index};
undefined
> var b = [-3,-2,-5,-3,234,45,324,56,234];
undefined
> b.every(a);
false
> var b = [234,345,546,234,435,234];
undefined
> b.every(a);
true
>
// 这个高阶函数将会返回一个新的函数
// 这个高阶函数将会对其返回的函数求反
function not(f) {   // 传入的函数为f
  return function() {
    var result = f.apply(this, arguments); // 在此处调用函数f(),并将其结果赋值给result this指代其传入的对象,arguments指代传入的参数
    return !result; // 将调用函数完成后的值取反,并返回
  }
}
> var even = function(x){return x % 2 === 0 };
undefined
> var odd = not(even);
undefined
> [234,34,234,345,56,234,234,45,234].every(odd);
false
>

大概解释一下,因为这个函数传入的是一个函数,所以先取得这个函数的取反后的函数,然后将取反后的结果赋值一个新的变量,在对这个取反后返回的函数使用every方法,取得遍历。得出结果

not为高阶函数,接收一个函数,并将这个函数进行处理,在进行返回,调用的时候双括号直接调用,或者即可。

ps;关于es6的写法

function (x) {
    return x + 6;
}

等价于

x => x + 6;

高阶函数;
接收f()和g(),并返回f(g())

function compoes(f, g) {
  return function() { // 因为是对函数进行处理,所以返回为函数
    return f.call(this, g.apply(this, arguments));
  };
}

来运行一下这个函数
计算f1(f2())

var f1 = function(x){ return x*x };
undefined
var f2 = function(x, y){return x + y};
undefined
var f3 = compoes(f1, f2);
undefined
f3(2,3);
25

ok~
耶,灰常完美,完成了高阶函数,对于函数的处理

猜你喜欢

转载自blog.csdn.net/melovemingming/article/details/81059073