高阶函数

161 阅读1分钟

首先,什么叫高阶函数。

高阶函数有两个特点:

1)如果一个函数的参数是一个函数(回调函数也是高阶函数),那么这个函数就是高阶函数;

2)如果一个函数返回一个函数,那么这个函数也是高阶函数。

举个例子:

我们判断一个变量的类型有几种方法:

1)typeof 缺点:无法辨别对象类型

2)constructor 谁构造出来的

3)instanceof 判断是谁的实例  __proto__

最准确的方法是:Object.prototype.toString.call

首先:Object.prototype.toString 的作用是返回调用者的对象字符串[object xxx];

call方法改变指向,即可得到content的指向的字符串

例子1:实现一个函数,判断 某个变量的类型

function isType(type){
    // 将String保存在这个代码块中
    return function(content){
        //为了改变this指向
        return Object.prototype.toString.call(content) === `[object ${type}]`
    }
}
//高阶函数实现了第一个功能  保存变量
let isString = isType('String');
console.log(isString('hello'))    //true

例子2:写一个公共方法,在say前执行一个函数

fucntion say(who){
     console.log(who+'say')
}
Function.prototype.before = function(callback){
    //args 就是当前参数的一个数组['张三']
    return (...args)=>{
        callback();
        //箭头函数中 没有this 没有arguments  this指向Say
        //展开运算符 可以将数组展开一次传入
        this(...args)
    }
}
let newSay = say.before(function(){
    console.log('刷牙')
})
newSay('张三')    // 刷牙  张三say

例3:写一个公共方法after,获取异步加载的数据

const fs = require('fs');

Function.prototype.after = function(times, callback){
    let recourse = {}
    reteurn function(key, value){
        recourse[key] = value;
        if(--times == 0){
            callback(recourse)
        }
    }
}

let out = after(2, function(recourse){
    console.log(recourse)    //{ age: '10', name: '张三' }
})

fs.readFile('./name.txt', 'utf8', function(err, data){
    if(err) return;
    out('name', data)
})
fs.readFile('./age.txt', 'utf8', function(err, data){
    if(err) return;
    out('age', data)
})