1. 程式人生 > 其它 >手寫 apply call bind 三個方法

手寫 apply call bind 三個方法

call,apply,bind。其實呢這三兄弟都是為了改變函式的上下文而存在的,或者可以簡單點說就是用來改變this指向的。但是呢這三兄弟的用法還是有區別的。

1、apply和call會讓當前函式立即執行,而bind會返回一個函式,後續需要的時候再呼叫執行

2、apply最多隻能有兩個引數,而call,bind可以有多個引數,第一個引數和apply一樣,是用來替換的物件,後邊是引數列表

Function.prototype.Mycall = function (context) {
    const that = context || window ;
    that.ctx = this
; 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

}



Function.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(); } }