js中改变this指向的三种方式

js中改变this指向的三种方式

1、call方法

使用 call 方法调用函数,同时指定函数中 this 的值,使用方法如下代码所示:

<script>
  const obj = {
    uname: '刘德华'
  }
  function fn(x, y) {
    console.log(this) 
    console.log(x + y)
  }
  // 1. 调用函数  
  // 2. 改变 this 指向
  fn.call(obj, 1, 2)
</script>

运行结果如下:
在这里插入图片描述
总结:

  1. call 方法能够在调用函数的同时指定 this 的值
  2. 使用 call 方法调用函数时,第1个参数为 this 指定的值
  3. call 方法的其余参数会依次自动传入函数做为函数的参数

2、apply方法

使用 call 方法调用函数,同时指定函数中 this 的值,使用方法如下代码所示:

<script>
 const obj = {
    age: 18
  }
  function fn(x, y) {
    console.log(this) // {age: 18}
    console.log(x + y)
  }
  // 1. 调用函数
  // 2. 改变this指向 
  //  fn.apply(this指向谁, 数组参数)
  fn.apply(obj, [1, 2])
  // 3. 返回值   本身就是在调用函数,所以返回值就是函数的返回值

  // 使用场景: 求数组最大值
  // const max = Math.max(1, 2, 3)
  // console.log(max)
  const arr = [100, 44, 77]
  const max = Math.max.apply(Math, arr)
  const min = Math.min.apply(null, arr)
  console.log(max, min)
  // 使用场景: 求数组最大值
  console.log(Math.max(...arr))
</script>

运行结果如下:
在这里插入图片描述
总结:

  1. apply 方法能够在调用函数的同时指定 this 的值
  2. 使用 apply 方法调用函数时,第1个参数为 this 指定的值
  3. apply 方法第2个参数为数组,数组的单元值依次自动传入函数做为函数的参数

3、bind方法

bind 方法并不会调用函数,而是创建一个指定了 this 值的新函数,使用方法如下代码所示:

<script>
 const obj = {
    age: 18
  }
  function fn() {
    console.log(this)
  }

  // 1. bind 不会调用函数 
  // 2. 能改变this指向
  // 3. 返回值是个函数,  但是这个函数里面的this是更改过的obj
  const fun = fn.bind(obj)
  // console.log(fun) 
  fun()

  // 需求,有一个按钮,点击里面就禁用,2秒钟之后开启
  document.querySelector('button').addEventListener('click', function () {
    // 禁用按钮
    this.disabled = true
    window.setTimeout(function () {
      // 在这个普通函数里面,我们要this由原来的window 改为 btn
      this.disabled = false
    }.bind(this), 2000)   // 这里的this 和 btn 一样
  })
</script>

运行结果如下:
在这里插入图片描述
注:bind 方法创建新的函数,与原函数的唯一的变化是改变了 this 的值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端~初学者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值