高阶函数

特点一 函数可以作为参数
  1. // 手写一个forEach
  2. const myForEach = (array, fn) => {
  3. for (let i = 0; i < array.length; i++) {
  4. fn(array[i]);
  5. }
  6. };
  7. const arr = [1, 5, 6, 3, 32, 42];
  8. myForEach(arr, (item) => {
  9. console.log(item);
  10. });
  11. // 手写一个 filter
  12. const myFilter = (array, fn) => {
  13. const results = [];
  14. for (let i = 0; i < array.length; i++) {
  15. if (fn(array[i])) {
  16. results.push(array[i]);
  17. }
  18. }
  19. return results;
  20. };
  21. const evenNum = myFilter(arr, (item) => {
  22. return item % 2 !== 0;
  23. });
  24. console.log(evenNum);

特点二 函数可以作为返回值
  1. // 函数可以作为返回值
  2. const demoFn = () => {
  3. return (str) => {
  4. console.log(str);
  5. };
  6. };
  7. demoFn()("Hello !");
  8. // 仿写 loadsh 的 once 函数
  9. const myOnce = function (fn) {
  10. let flag = false;
  11. return function () {
  12. if (!flag) {
  13. flag = true;
  14. fn.apply(this, arguments);
  15. }
  16. };
  17. };
  18. const payFn = myOnce((money) => {
  19. console.log(`您支付了 ${money} RMB`);
  20. });
  21. payFn(5);
  22. payFn(15);
  23. payFn(45);