JavaScript基礎之--- 手寫 call 的實現


 

call方法

  f.myCall(obj)   就是將f方法添加到obj的屬性中,f中的this 指向 obj;即 obj.f()

 

// 思路:將~要改變this指向的方法,掛到目標對象上執行並返回
Function.prototype.myCall = function(context) {
    if(typeof this !== 'function') {
        throw new TypeError('not function')
    }
    context = context || window
    //***************************************************************************************************
    // 這三步也可以這樣理解:
    // this指的就是調用call 方法的函數
    // 給當前上下文(call方法的第一個參數)添加一個屬性fn,屬性值為this,當前上下文就可以調用這個方法了。
    // 把call方法傳入的其他的參數傳入到屬性fn指代的函數中,直接調用函數
    // f.myCall(obj) 就是將f方法添加到obj的屬性中,f中的this 指向 obj
    
    context.fn = this;                   //this指向的是當前的函數(Function實例)
    let arg = [...arguments].slice(1);   //獲取除了this指向對象以外的參數,空數組slice后返回仍是空數組
    let result = context.fn(...arg);     //隱式綁定,當前函數的this指向context
   //***************************************************************************************************
   delete context.fn
   return result
}

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM