call,apply,bind方法改变this指向的原理

 Function.prototype.myCall=function myCall(obj,...ary){
        // this指向调用myCall的函数 =》fn.myCall(obj,...ary)  =》 myCall中的this指向fn函数
        obj.fn=this;
        // 将this挂到obj的属性上,然后使用obj.fn(...ary)执行fn1(fn就是外面的fn1),
        // 这样函数执行其中的this就指向了obj了,然后将我们传进来的参数传进fn即可
        //apply其实原理也差不多,只不过传进来的是一个数组,myApply(obj,ary),然后我们执行的时候...ary使用展开运算符就行了
        
        obj.fn(...ary)
    }
    function fn1(x,y){
        console.log(this);
        console.log(...arguments);
    }
    let obj1={name:'等待'};
    fn1.myCall(obj1, 10, 20);

如果不明白this为什么会变成obj,可以参考:this的几种情况:https://blog.csdn.net/qq_40959677/article/details/93505757

    /**
     * bind预储存原理以及高阶js思想:柯理化函数思想
     * bind方法执行,会形成一个不销毁的作用域,同时在作用域中记录下bind方法执行时传进来的参数信息,且bind方法中的
     * this就是预执行函数,也需要记录下来,然后返回一个小函数给外面的引用,所以bind方法执行的时候并没有执行bind前
     * 面.前面的方法,只是记录下来了,当达到某些条件时触发bind留在外面的引用执行的时候,会将之前bind预存储时存储的
     * 方法进行执行,将参数传进去,使用call或者apple改变一下this指向,考虑到如果是事件行为的预存储,会传入ev事件
     * 对象所有在返回的小函数中要接受其参数,然后一并传给预执行函数执行
     * 这种预处理思想就是柯理化函数思想,将后面需要用到的东西提前进行保存(闭包保存),然后在后期进行调用
     */
    Function.prototype.myBind=function myBind(context,...ary){
        //this => 预执行方法
        //context => 预执行方法中的this指向
        //ary => 预执行方法参数集合,第一个参数是改变this指向的对象
        let _that=this; //this就是预执行函数,需要记录下来供返回函数使用
        return function (...innerArg){
            //返回一个匿名函数,这样调用myBind预存储的时候就会形成一个不销毁的作用域
            _that.apply(context,ary.concat(innerArg));
        }
    }
    function fn3(x,y){
        console.log(...arguments);
    }
    let obj3={name:'等待'};
    document.body.onclick=fn3.myBind(obj3,10,20);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值