手寫 apply call bind 三個方法
阿新 • • 發佈:2021-07-14
call,apply,bind。其實呢這三兄弟都是為了改變函式的上下文而存在的,或者可以簡單點說就是用來改變this指向的。但是呢這三兄弟的用法還是有區別的。
1、apply和call會讓當前函式立即執行,而bind會返回一個函式,後續需要的時候再呼叫執行
2、apply最多隻能有兩個引數,而call,bind可以有多個引數,第一個引數和apply一樣,是用來替換的物件,後邊是引數列表
Function.prototype.Mycall = function (context) { const that = context || window ; that.ctx = thisFunction.prototype.MyBind=function(context){ // 然後 bind 返回的是一個函式!!! constcxt=JSON.parse(JSON.stringify(context))||window; cxt.func=this; constargs=Array.from(arguments).slice(1); console.log(arguments,'a') returnfunction(){ constallArgs=args.concat(Array.from(arguments)); console.log(allArgs,'b'); returnallArgs.length>0?cxt.func(...allArgs):cxt.func(); } }; const args = Array.from(arguments).slice(1); const result = arguments.length > 1 ? that.ctx(...args) : that.ctx(); delete that.ctx; return result; } Function.prototype.MyApply = function(context){ // apply 傳參第二個引數為陣列!!!需要注意一點
const ctx = context || window;
ctx.func = this;const
const res = arguments[1] ? ctx.func(...arguments[1]):ctx.func();
delete ctx.func;
return res
}