码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript基础之--- 手写 call 的实现

时间:2020-03-09 17:51:33      阅读:53      评论:0      收藏:0      [点我收藏+]

标签:turn   cti   argument   隐式   style   img   func   ice   prototype   

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
}

 

 

 

 

 

技术图片

 

JavaScript基础之--- 手写 call 的实现

标签:turn   cti   argument   隐式   style   img   func   ice   prototype   

原文地址:https://www.cnblogs.com/james23dong/p/12449892.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!