高階函數、回調函數、閉包

如今有一個需求,讀取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

相關文章
相關標籤/搜索