手写实现call函数,apply函数,bind函数

callapplybind
用法function.call(thisArg,arg1,arg2,arg3...)
功能使用一个指定的this值和单独给出的一个或者多个参数来调用一个函数。创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列
返回值使用调用者提供的this值和参数调用该函数的返回值,若方法无返回值,返回undefined。
注意点

1.this可以传null或者undefined,此时this指向window;

2.this参数可以传基本数据类型,原生call会自动用Object()转换;

3.函数是可以有返回值的;

4.将函数添加到指定对象中,用delete删除(消除副作用)

 整体与call类似,apply调用的时候,第二个参数是个数组
步骤

1.获取第一个参数,构建对象

2.将对应函数传入该对象

3.获取参数并执行相应函数

4.删除该对象中的函数,消除副作用

5返回结果

1、将函数设置为对象的属性;

2、处理传入的参数;

3、返回函数的定义/引用;

4、外层执行接收的函数;

5、删除对象上第一步设置的函数;

1.call函数

Function.prototype.myCall = function(){
  let target = arguments[0]|| window || global
  target.fn = this
  let args = Array.from(arguments).slice(1)
  let result = target.fn(...args)
  delete target.fn
  return result 
}

2.apply函数

Function.prototype.myApply = function(){
  let target = arguments[0]|| window || global
  target.fn = this
  let args = Array.from(arguments)[1]
  let result = target.fn(...args)
  delete target.fn
  return result 
}

3.bind函数

Function.prototype.myBind = function(context) {
    const _this = this
    const args = [...arguments].slice(1)
    console.log(this)
    // 返回一个函数
    return function F() {
        // 因为返回了一个函数,我们可以 new F(),所以需要判断
        if (this instanceof F) {
            // 忽略传入的this
            return new _this(...args, ...arguments)
        }
        // 直接调用,将两边的参数拼接起来
      
        return _this.apply(context, args.concat(...arguments))
    }
}

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值