高阶函数、回调函数、闭包

现在有一个需求,读取3个本地文件(s1.txt、s2.txt、s3.txt),3条数据全部拿到之后,打印 ("读取成功" + 数据内容) 。

1、最简单最不靠谱的写法

let fs = require('fs');
let returnAry = [];
fs.readFile('s1.txt', 'utf8', function(err, data) {
    returnAry.push(data);
    if(returnAry.length === 3){
        console.log('读取成功:' + returnAry);
    }
});
fs.readFile('s2.txt', 'utf8', function(err, data) {
    returnAry.push(data);
    if(returnAry.length === 3){
        console.log('读取成功:' + returnAry);
    }
});
fs.readFile('s3.txt', 'utf8', function(err, data) {
    returnAry.push(data);
    if(returnAry.length === 3){
        console.log('读取成功:' + returnAry);
    }
});
复制代码

2、代码冗余,优化

let fs = require('fs');
let returnAry = [];
function print(data) {
    returnAry.push(data);
    if (returnAry.length === 3) {
        console.log('读取成功:' + returnAry);
    }
}
fs.readFile('s1.txt', 'utf8', function(err, data) {point(data);});
fs.readFile('s2.txt', 'utf8', function(err, data) {point(data);});
fs.readFile('s3.txt', 'utf8', function(err, data) {point(data);});
复制代码

3、扩展性不太好,优化

如果读取的4个本地文件,那么就需要去print函数中修改判断的数字

let fs = require('fs');
let ASYNC_READ_NUM = 3;

/**
 * @param {number} times 执行次数
 * @param {function} callback 成功后的回调
 * @returns {function} function
 */
function _after(times, callback) {
  let returnAry = [];
  if (typeof callback !== 'function') {
    throw new Error('参数错误');
  }
  return function (data) {
    returnAry.push(data);
    if (returnAry.length === times) {
      callback(returnAry);
    }
  };
}
let print = _after(ASYNC_READ_NUM, function (data) {
  console.log('读取成功:' + data);
});
fs.readFile('s1.txt', 'utf8', function (err, data) {print(data);});
fs.readFile('s2.txt', 'utf8', function (err, data) {print(data);});
fs.readFile('s3.txt', 'utf8', function (err, data) {print(data);});
复制代码

高阶函数

在《javascript设计模式和开发实践》中是这样定义的

  • 函数可以作为参数被传递;
  • 函数可以作为返回值输出;

回调函数

  • 函数A作为参数(地址引用)传递到了函数B中,在函数B中函数A被执行了。

闭包

一个函数内部,return 一个函数出去,而 return 的这个函数就是 “闭包”

闭包的主要用途:可以让外界读取到函数内部的变量。

闭包的问题:主要是内存泄漏,在函数的生命周期结束时,手动释放掉这个引用,设置成 null 即可

附:这篇博客 也许 想表达 (高阶、回调、闭包) 之间我中有你你中有我的亲情 (⊙﹏⊙)b

转载于:https://juejin.im/post/5b0784436fb9a07aae1599f8

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值