美文网首页
实现call、apply、bind函数

实现call、apply、bind函数

作者: 河东和河西 | 来源:发表于2020-04-23 12:05 被阅读0次
  • call和apply方法使用时的调用对象为一个方法,call函数和apply方法可改变调用者的this,处理方式相同。
  • bind方法和call、apply一样改变调用者的this,只是该调用者还未执行,返回一个函数。该函数用new操作符调用时需注意两点:
  • new操作时new的优先级大于context,需处理判断this指针
  • bind中返回函数的原型是调用bind方法的调用者原型的一个实例

1、call函数

Function.prototype.myCall = function(context) {
    if (typeof this !== 'function') {
        return;
    }//判断调用者是一个方法
    context=context||window ;//判定第一个参数,没有则为window
    context.fn = this;//定义context上的一个属性,赋值为调用myCall函数的那个函数,改变this指针的关键一步
    const args = [...arguments].slice(1);//处理参数
    const result = context.fn(...args);//执行函数 当前this为context
    delete context.fn;//删除该函数 释放内存
    return result;//返回该函数的结果
}

2、apply函数

Function.prototype.myApply = function(context) {
    if (typeof this !== 'function') {
        return;
    }
    context = context || window;
    context.fn = this;
    let result;
    if (arguments[1]) {
        result = context.fn(...arguments[1]);
    } else {
        result = context.fn();
    }
    delete context.fn;
    return result;
}

3、bind函数

Function.prototype.myBind = function(context) {
    if (typeof this !== 'function') {
       return;
    }
    const that = this;//返回一个绑定this的函数,这里我们需要保存this
    const args = [...arguments].slice(1);//参数处理
    var F = function(){
        var _this=this instanceof that?this:context//确定this,new操作的优先级大于context
        return that.apply(_this, args.concat(...arguments))
    }
    F.prototype = Object.create(this.prototype);//F.prototype是this.prototype的一个实例
    return F;
}

相关文章

  • JS进阶知识点和常考面试题

    手写 call、apply 及 bind 函数 涉及面试题:call、apply 及 bind 函数内部实现是怎么...

  • js中apply/call/bind

    apply/call/bind 使用apply/call/bind改变 this 指向的 实现过程 apply 使...

  • 详解如何实现call/apply/bind

    call、apply 及 bind 函数内部实现是怎么样的? 一、call call改变了this指向 函数执行 ...

  • call(),apply()和bind()

    call、apply和bind函数存在的区别:bind返回对应函数, 便于稍后调用; apply, call则是立...

  • 手动实现前端轮子

    1.手动实现 call、apply、bind call 实现 call 核心: 将函数设为对象的属性 执行&删除这...

  • apply, call, bind

    apply, call, bind 都是用来改变函数的this对象的指向 apply, call, bind 第一...

  • bind call apply

    区别:call和apply调用就是执行函数 bind返回新函数 bind利用call或apply兼容i...

  • JS模拟实现bind,call,apply

    call apply bind 简单实现 函数柯里化的实现 构造函数的实现 ES6实现 结合实现

  • this_原型链_继承

    问题1: apply、call 、bind有什么作用,什么区别 bind,apply,call:都是返回一个函数,...

  • this_原型链_继承

    问题1: apply、call 、bind有什么作用,什么区别 apply ,call,bind都会改变函数的执行...

网友评论

      本文标题:实现call、apply、bind函数

      本文链接:https://www.haomeiwen.com/subject/tifoihtx.html