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 }

