首先,什么叫高阶函数。
高阶函数有两个特点:
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)
})