<script type="text/javascript"> // 手写 call 原理详解 // 核心,在目标对象中创建函数方法等于执行的函数,然后用目标对象调用此方法(此时this指向目标对象),然后删掉创建的方法,返回结果 // 使用 call apply bind 的都是函数 所以此方法写在 function 的构造函数 Function 的原型上面 Function.prototype.mycall = function(content){ //创建一个变量,这个变量即一个参数传过来的对象, 所以这个变量为一个对象 const context = content || window //此处的 this 为调用 .mycall 的函数,个人觉得,调用 mycall 方法的函数为Function的实例,实例调用原型上的 mycall 此处的 this 则指向实例 // console.log(this) //context对象创建 一个函数方法fn 等于函数实例,也就是调用 mycall 的函数 context.fn = this //此处获取除一个参数以后的所有参数 const arg = [...arguments].slice(1) //在 context 对象中执行 函数实例,调用者为 context 对象 const res = arg.length ? context.fn(...arg) : context.fn(...arg) //为了不影响 context 对象,所以把 context 上挂载的 fn 方法删掉 delete context.fn //返回结果 return res } Function.prototype.myApply = function(obj) { const context = obj || window context.fn = this const res = arguments[1] ? context.fn(...arguments[1]) : context.fn() delete context.fn return res } const age = 18 const obj = { name:'hong', objName : this.age, myFn(){ console.log(this.name) } } const obj1 = { name: 'hong1', age: 18 } // obj.myFn() // obj.myFn.call(obj1) // obj.myFn.mycall() obj.myFn.myApply(obj1) </script>
人生很漫长,或许我只是你人生中微不足道的一小段,只是你人生中的惊鸿一瞥。