当前位置: 首页 > Web前端 > JavaScript

调用、应用、绑定的优雅实现

时间:2023-03-26 23:26:29 JavaScript

ImplementcallFunction.prototype_call(context){//只能调用函数if(typeofthis!=="function"){thrownewTypeError("error");}//如果不指定,默认指向windowcontext=context||窗户;//将参数转换为数组constargs=[];for(leti=1;i<=arguments.length;i++){args.push(arguments[i]);}//使用符号作为键以避免重复constfn=Symbol();上下文[fn]=这个;//你也可以使用Spread语法传递参数context[fn](...args)constret=eval("context[fn]("+args+")");删除上下文[fn];返还;}实施应用Function.prototype._apply=function(context=window,arg){if(typeofthis!=="function"){thrownewTypeError("error");}constfn=符号();上下文[fn]=这个;上下文[fn](arg);删除上下文[fn];返回资源;};实施绑定Ffunction.prototype._bind=function(thisArg=window,...args){if(typeofthis!=="function"){thrownewTypeError("错误");}constfn=符号();thisArg[fn]=这个;const_this=这个;//调用bind后返回一个函数returnfunctionbindFn(...params){//这里判断是否被new调用if(thisinstanceofbindFn){returnnew_this(...args,...params);}else{constres=thisArg[fn](...args,...params);删除这个参数[fn];返回资源;}};};