由来: MDN First-class Function

    1. 函数存储在变量中
    2. 函数可以作为参数
    3. 函数作为返回值

    在JavaScript中函数是一个对象的表现形式, 可以通过 new Function() 实例化对象, 将函数存储在变量或者数组中,也可以作为一个函数的参数传递, 也可以作为函数返回值来执行

    1. //把函数赋值给变量
    2. let fn = function(){
    3. console.log('123')
    4. }
    5. fn()
    6. //示例
    7. const obj = {
    8. index: fn
    9. }

    函数作为参数

    1. /**
    2. * @desc 函数作为参数
    3. */
    4. function forEach(arr, fn) {
    5. for (let i = 0; i < arr.length; i++) {
    6. fn(arr[i]);
    7. }
    8. }
    9. // 测试
    10. // let arr = [1,2,3,4,5,6,7,8,9]
    11. // forEach(arr, (val)=>{
    12. // console.log(val)
    13. // })
    14. /**
    15. * @desc 函数作为参数
    16. */
    17. // function filter(arr, fn) {
    18. // let result = [];
    19. // for (let i = 0; i < arr.length; i++) {
    20. // if (fn(arr[i])) {
    21. // result.push(arr[i]);
    22. // }
    23. // }
    24. // return result;
    25. // }
    26. // const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
    27. // const res = filter(arr, (val) => {
    28. // return val % 2 === 0;
    29. // });
    30. // console.log(res)
    31. function map(arr, fn){
    32. let result = [];
    33. for (let i = 0; i < arr.length; i++){
    34. if(fn(arr[i])){
    35. result.push(arr[i])
    36. }
    37. }
    38. return result;
    39. }
    40. const arr = [1, 2, 3, 4, 5, 6,]
    41. const res = map(arr, (val) =>{
    42. if(val > 3){
    43. return val > 3 ? true : false
    44. }
    45. })
    46. console.log(res)

    函数作为返回值

    1. /**
    2. * 函数作为返回值
    3. */
    4. function makeFn() {
    5. const msg = "hello";
    6. return () => {
    7. console.log(msg);
    8. };
    9. }
    10. // makeFn()()
    11. /**
    12. * @desc 函数只执行一次
    13. */
    14. function once(fn) {
    15. let flag = false;
    16. return function () {
    17. if (!flag) {
    18. flag = true;
    19. return fn.apply(this, arguments);
    20. }
    21. };
    22. }
    23. const pay = once((res) =>{
    24. console.log('res', res);
    25. })
    26. pay(10)
    27. pay(10)
    28. pay(10)
    29. pay(10)