JS手写call、apply的实现方式

call()apply()bind()()三种方法主要用来改变this指向,区别在于三种方法的使用方式不同。

  1. call(obj, ...)方法通过以单个参数传入方式使用。

    注意:标红处...表示多个参数;以下代码仅测试方法是否能够使用,并没有测试传参问题

    var a = 5;
    var obj = {
        a: 3,
        fun1: function () {
            console.log(this.a);
        }
    };
    Function.prototype.myCall = function (context) {
        if (typeof this !== "function") {
            throw new TypeError(`This isn't a function!`);
        }
        context.fn = this; // 将调用myCall方法的函数赋值一份,这里指fun1函数
        console.log(context.fn);
        var arr = [];
        for (var i = 1; i < arguments.length; i++) {
            arr.push("argument[" + i + "]");
        }
        var result = eval("context.fn(" + arr + ")"); //重新生成一份fun1函数执行并返回结果给reuslt
        console.log(context.fn);
        delete context.fn;
        return result;
    };
    var nFun1 = obj.fun1;
    nFun1.myCall(obj);
    
  2. apply(obj, [...])方法同样改变this指针指向,不同的是它传入的一个数组
    var a = 5;
    var obj = {
        a: 3,
        fun1: function () {
            console.log(this.a);
        }
    };
    Function.prototype.myApply = function (context, arr) {
        if (typeof this !== 'function') {
            throw new TypeError('this is not function!');
        }
        context.fn = this;
        var result;
        if (!arr) {
            result = context.fn();
        } else {
            var args = [];
            for (var i = 1; i < arguments.length; i++) {
                args.push('argument[' + i + ']');
            }
            result = eval('context.fn(' + args + ')');
        }
        delete context.fn;
        return result;
    };
    var nFun1 = obj.fun1;
    nFun1.myApply(obj);
    
  3. bind()()方法使用方式通call()类似
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值