代码如下(示例):
/**
* 自定义call函数
* @param Fn 所要执行的函数
* @param obj 函数运行时指向的对象
* @param args 函数运行时的参数
*/
function call(Fn,obj,...args){
if(obj === undefined || obj===null){
obj = globalThis; // 全局对象
}
// 为obj添加临时的方法
obj.temp = Fn;
// 调用temp方法
let result = obj.temp(...args);
// 删除temp方法
delete obj.temp;
return result;
}
/**
* 自定义apply函数
* @param Fn
* @param obj
* @param args
*/
function apply(Fn,obj,args){
if(obj === undefined || obj===null){
obj = globalThis; // 全局对象
}
// 为obj添加临时的方法
obj.temp = Fn;
// 调用temp 方法
let result = obj.temp(...args);
delete obj.temp;
return result;
}
/**
* 自定义bind函数
* @param Fn
* @param obj
* @param args
*/
function bind(Fn,obj,...args){
// 返回一个新的函数
return function(...args2){
// 作用是调用目标函数,改变其内部this的指向
// 调用call函数
return call(Fn,obj,...args,...args2);
}
}
/**
* 自定义节流函数 控制分配平均时间执行一次
* @param callback 回调函数
* @param wait 等待时长
*/
function throttle(callback,wait){
// 定义开始时间
let start = 0;
// 返回结果是一个函数
return function(event){
// 获取当前的时间戳
let now = Date.now();
if(now-start>=wait){
// 若满足条件则执行回调函数
callback.call(this,event);
// 修改开始时间
start = now;
}
}
}
/**
* 自定义防抖函数 只触发最后一次回调事件
* @param callback 回调函数
* @param time 间隔时长
*/
function debounce(callback,time){
// 定时器变量
let timeId = null;
return function(event){
if(timeId!=null){
clearTimeout(timeId);
}
timeId = setTimeout(()=>{
// 执行回调
callback.call(this,event);
// 重置定时器变量
timeId = null;
},time)
}
}
/**
* 自定义map函数
* @param arr
* @param callback
*/
function map(arr,callback){
// 声明一个空数组
let result = [];
// 遍历数组
for(let i=0;i<arr.length;i++){
result.push(callback(arr[i],i));
}
return result;
}
/**
* 自定义reduce函数
* @param arr
* @param callback
* @param initValue
*/
function reduce(arr,callback,initValue){
// 声明变量
let result = initValue;
// 执行回调
for(let i = 0;i<arr.length;i++){
result = callback(result,arr[i]);
}
return result;
}
/**
* 自定义filter函数
* @param arr
* @param callback
*/
function filter(arr,callback){
// 声明空数组
let result = [];
// 遍历数组
for(let i=0;i<arr.length;i++){
// 执行回调
let res = callback(arr[i],i)
// 判断 如果为真
if(res){
result.push(arr[i]);
}
}
return result;
}
/**
* 自定义find函数
* @param arr
* @param callback
*/
function find(arr,callback){
for(let i=0;i<arr.length;i++){
// 执行回调
let res = callback(arr[i],i);
if(res){
// 返回当前正在遍历的元素
return arr[i];
}
}
// 如果没有遇到满足条件的,返回undefined
return undefined;
}
/**
* 自定义findIndex函数
* @param arr
* @param callback
* @returns {undefined|*}
*/
function findIndex(arr,callback){
for(let i=0;i<arr.length;i++){
// 执行回调
let res = callback(arr[i],i);
if(res){
// 返回当前正在遍历的元素下标
return i;
}
}
// 如果没有遇到满足条件的,返回-1
return -1;
}
/**
* 自定义every函数
* @param arr
* @param callback
*/
function every(arr,callback){
for