call/bind/apply 三者的区别,以及如何实现

文章目录


前言

1.thisArg
在 function 函数运行时使用的 this 值。请注意,this可能不是该方法看到的实际值:如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动替换为指向全局对象,原始值会被包装。
this指向:非严格模式下,指向window。严格模式下,为undefined。


一、apply / call / bind 三者的区别?

  1. 首先他们三者都是用来改变this的指向的
  2. 三者的第一个参数都是this要指向的对象,也就是指定上下文
  3. apply和call两者都可以利用后续参数传参,但是传参的方式不一样,apply是数组,call则是正常传参形

  4. bind是返回对应函数,便于稍后调用,apply,call则是立即调用

二、代码

代码如下(示例):

Function.prototype.mycall = function(object){
  //定义一个obj,如果有object就使用object,如果没有就使用window
  let obj = object || window;
  //在obj里定义一个fn属性,再把当前this传进去,谁调用this,obj就指向谁
  obj.fn = this; 
  let arg = [...arguments].slice(1);
  let result = obj.fn(...arg);
      return result
  }
  let sum = {a:12,b:15}
  function test(){
     console.log(sum);
  }
  test.mycall(sum,10,100)


实现思路主要是:

        判断是否是函数调用,若非函数调用抛异常

        通过新对象(context)来调用函数

        ①给context创建一个fn设置为需要调用的函数

        ②结束调用完之后删除fn

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值