zoukankan      html  css  js  c++  java
  • 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
    }

  • 相关阅读:
    [Luogu 3794]签到题IV
    [JSOI 2015]最大公约数
    [BZOJ 5123][Lydsy1712月赛]线段树的匹配
    [BZOJ 5127][Lydsy1712月赛]数据校验
    [Codeforces Educational Round 71]Div. 2
    [NOIp 2018]all
    [BZOJ 2134]单选错位
    [hihoCoder 1384]Genius ACM
    [POJ 3233]Matrix Power Series
    [USACO 09FEB]Bullcow
  • 原文地址:https://www.cnblogs.com/james23dong/p/12449892.html
Copyright © 2011-2022 走看看