function myNew(){
var obj={};//创建一个空对象
var Constructor=[].shift().apply(arguments);//获得构造函数
obj.__proto__=Constructor.prototype;//链接到原型
var result = Constructor.call(obj,arguments);//绑定this,执行构造函数
return typeof result==='object' ? result : obj //确保new出来的是个对象
}
function myCall(context){
var context=context||window;
context.fn=this;
var args=[...arguments].slice(1);
var result=context.fn(...args);
return result;
delete context.fn
}
function myApply(context){
var context=context||window;
context.fn=this;
var args=arguments[1];
var result;
if(args){
result=context.fn(...args)
}else{
result=context.fn()
}
return result
delete context.fn
}
function debounce(func,wait){
let timeout;
return function(){
let context=this;
let args=arguments;
if(timeout) clearTimeout(timeout)
timeout=setTimeout(()=>{
func.apply(context,args)
},wait);
}
}
function debounce(func,wait){
let timeout;
return function(){
let context=this;
let args=arguments;
if(timeout) clearTimeout(timeout)
let callNow=!timeout;
timeout=setTimeout(()=>{
timeout=null
},wait)
if(callNow) func.apply(context,args)
}
}
//节流
//时间戳版
function throttle(func,wait){
let previous=0;
return function(){
let now=Date.now();
let context=this;
let args=arguments;
if(now-previous>wait){
func.apply(context,args)
previous=now;
}
}
}
function throttle(func,wait){
let timeout
return function(){
let context=this;
let args=arguments;
if(!timeout){
setTimeout(()=>{
timeout=null
func.apply(context,args)
},wait)
}
}
}
function curry(fn){
let len=fn.length;
return function temp(){
//收集本次传递参数
let args = [...arguments];
if(args.length>=len){
return fn(...args);
}else {
return function(){
temp(...arguments,...args);
}
}
}
}
前端面试手撕代码之new,call,apply,bind,防抖,节流,函数柯里化
最新推荐文章于 2024-04-03 13:08:44 发布