前端学习记录(九) 利用call手动实现bind()方法

最近学习到了改变this指向的三种方式:call、apply与bind,一个经典题目就是用call或者apply手动实现bind方法,下面就来实现一下:

手动实现的bind除了做到改变前方函数的this指向之外,还要拥有bind本来拥有的两个功能:

  1. 在执行xxx.bind()时,不进行函数调用,仅仅将函数值传过来,后再接括号才进行调用;
  2. bind后的括号中,除第一个值为this的新指向,其余的几个值均为向函数内传入的参数

有一个问题值得注意:再利用arguments读取参数时,因为arguments读取到的是类数组,而不是真正的数组,所以用splice()无法直接读取,需使用call()方法将splice指向arguments进行“曲线救国”

代码实现:

        var obj = {
            a:"aaa",
        }
        var fun = function(text){
            var a ="bbb";
            console.log(this.a+"+"+text);
        }
        Function.prototype.bind2 = function(){
            var _this = arguments[0];//利用arguments[0]存入bind2的第一个参数,即fun函数中this的新指向
            var options = Array.prototype.splice.call(arguments,1);
            //如果直接调用splice,会报错"splice is not a function"
            var k = this;//这里的this指向调用bind2的fun函数
            return function(){
                k.call(_this,options);//因为不能直接执行,所以返回值为函数
            }
        }
        fun.bind2(obj,"ccc")();//执行改变this指向后的fun函数

最后结果为:

实现了bind的原有功能 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值