【NodeJS】高阶函数是什么鬼??

  我们都知道Node也“站在巨人的肩上”。这个“巨人”是大名鼎鼎的 V8 引擎,有这样一个强大的“心脏”,再配合基于高阶函数和闭包的异步编码范式,使得用 Node 构建的程序在性能上有着出色的表现。

高阶函数

为什么会用到高阶函数?粗糙的说,就是为了闭包!

  高阶函数与闭包是两个联系非常紧密的概念。如果一个函数以一个或多个函数作为参数,或者返回一个函数,那么称此函数为高阶函数。Node中大部分的异步函数,参数列表的最后一项接受一个回调,这类异步函数就符合高阶函数的定义。高阶函数执行后返回的函数,或者接受的函数参数,则被称为闭包。闭包的最大特点是引用了它之外的变量,这些变量既不是全局的,也不是参数和局部的,而是作为闭包执行时的上下文环境存在。

function wrapper(price){
    var freeVal = price;
    function closure(delta){
        return freeVal * delta;
    }
    return closure;
}
var clo1 = wrapper(100);
var clo2 = wrapper(200);
setTimeout(function(){
    console.log(clo1(1));
    console.log(clo2(2));
}, 500);

// 运行结果  100  200

  函数wrapper是一个高阶函数,执行后返回一个闭包,这个闭包将price纳入自己的作用域,price 就不再是函数内部的局部变量,它有一个名字叫自由变量,其生命期与闭包绑定。price这样的自由变量被闭包内的代码引用,称为闭包执行的上下文。


接受函数作为输入的高阶函数

  这种高阶函数可作为一种模式的构造器,比如:我有快速排序/堆排序/希尔排序 等若干个排序函数,那么我只需要提供一个高阶函数,就能生成基于这若干种排序函数的排序器:

//排序器
var sortingGenerator = function(sortFunc){
    return function(args){
        var arguments = [].slice.call(args);
        return sortFunc(arguments);
    }
};
//引入排序算法
var heapSort = require('heapSort');
var heapSorter = sortingGenerator(heapSort);
//使用算法
heapSorter(4, 22, 44, 66, 77);

当然,其实这个高阶函数也输出了函数

输出函数的高阶函数

  和上例一样,高阶函数输出一个函数也很好理解:先闭包自由变量,根据它在将来调用时产生不一样的输出。
  比如,我需要一个函数,既可以算平方,也可以算立方,最好什么方都能算,这时我就需要一个如下片断的高阶函数:

//计算m的N次方
var powerOfN = function(n){
    return function(m){
        var res = 1;
        for(var i = 0; i < n; ++i){
            res *= m;
        }
        return res;
    } ;
};
//按需生成
var powerOf2 = powerOfN(2);
var powerOf3 = powerOfN(3);
//调用传参
console.log(powerOf2(3));
console.log(powerOf3(2)); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值