函数柯里化

// 什么叫高阶函数 : 1.如果一个函数的参数是一个函数 (回调函数也是一个高阶函数)
// 2.如果一个函数返回一个函数 这个函数就叫高阶函数
// 闭包

// 1) 判断类型 1) typeof 无法辨别对象类型 2) constructor 谁构造出来的
// 3) instanceof 判断谁是谁的实例 __proto__
// 4) Object.prototype.toString.call  缺陷就是不能细分是谁谁的实例 
function isType(type){
    // 将string保存在了这个代码块中
    return function (content) {
        // 为了改变this指向
        return Object.prototype.toString.call(content) === `[object ${type}]`
    }
}
// 高阶函数实现了第一个功能 保存变量 (闭包)
// let isString = isType('String');
// // 什么叫闭包:在定义的时候 函数就决定了 一个函数不在自己的所在作用域下执行
// isString('hello');
// let isNumber = isType('Number');
// isNumber(123); // bind方法
// console.log(isType('hello','String'))
// console.log(isType(123,'Number'))
let util = {};
['String','Number'].forEach((type)=>{
    util['is'+type] = isType(type);
});
console.log(util.isString(123))

//函数柯里化通用实现
const currying = (fn,arr=[])=>{
    let len = fn.length
    return function(...args){
        arr = [...arr,...args]
        if(arr.length < len){
            return currying(fn,arr)
        }else{
            return fn(...arr)
        }
    }
}

// 作业
// 函数的柯里化 函数的反柯里化(扩大函数的范围)
// 1) 柯里化
// function isType(type,content){

// }
// let isString = currying(isType,'String')
// isString('hello')

// 2) 反柯里化
// Object.prototype.toString => toString()

//
原文地址:https://www.cnblogs.com/TTblog5/p/13054419.html