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

如今有一个需求,读取3个本地文件(s1.txt、s2.txt、s3.txt),3条数据所有拿到以后,打印 ("读取成功" + 数据内容) 。javascript

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

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);
    }
});
复制代码

二、代码冗余,优化

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);});
复制代码

三、扩展性不太好,优化

若是读取的4个本地文件,那么就须要去print函数中修改判断的数字java

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 便可优化

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

相关文章
相关标签/搜索