// 什么叫高阶函数 : 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()
//