前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我攻克的技术难题:JS中改变this的指向:call()、apply()、bind()

我攻克的技术难题:JS中改变this的指向:call()、apply()、bind()

原创
作者头像
用户10637692
发布2024-01-23 19:30:50
2901
发布2024-01-23 19:30:50
举报
文章被收录于专栏:前端前端

3种动态指定普通函数中this的指向的方法:call()、apply()、bind()

在之前的学习中,我发现在学习了很多JS方法后,却没有真正的应用起来或者是理解什么时候需要使用这些方法,导致自己很快就遗忘自己所学过的知识。

所以在以后的笔记中,我都会添加这些所学知识的应用场景。

目录

⛳call()

⛳apply()

⛳bind()

🔔总结


⛳call()

语法

fun.apply(this.Arg, arg1, arg2, ...)

  • this.Arg: 在fun函数运行时指定的this值
  • arg1, arg2: 传递的其他参数
  • 返回值就是函数的返回值,因为它就是调用函数
代码语言:javascript
复制
  const obj = {
    age: 18
  }
  function fn(x, y) {
    console.log(this)
    console.log(x + y)
  }
  fn.call(obj, 1, 2)

应用场景

call()方法目前主要应用于实现继承

代码语言:javascript
复制
  function Person(uname, age, sex) {
    this.uname = uname;
    this.age = age;
    this.sex = sex
  }
  function Student(id, uname, age, sex) {
    this.stuId = id
    Person.call(this, uname, age, sex)
  }

  let StudentA = new Student('111', '小明', 16, '男')
  console.log(StudentA);

编辑

⛳apply()

语法

fun.apply(this.Arg,argsArray)

  • this.Arg: 在fun函数运行时指定的this值
  • argArray:传递的值,必须包含在数组里面
  • 返回值就是函数的返回值,因为它就是调用函数
代码语言:javascript
复制
  const obj = {
    age: 18
  }
  function fn(x, y) {
    console.log(this)
    console.log(x + y)
  }
  fn.apply(obj, [1, 2])

应用场景

经常和数组有关,比如借助于数组对象实现求数组最大最小值

代码语言:javascript
复制
  const arr = [100, 22, 23]
  const max = Math.max.apply(Math,arr)
  console.log(max) //100

⛳bind()

语法

fun.bind(this.Arg, arg1, arg2, ...)

  • this.Arg: 在fun函数运行时指定的this值
  • arg1, arg2: 传递的其他参数
  • 返回值是指定的this值和初始化参数改造的原函数拷贝(新函数)
代码语言:javascript
复制
  const obj = {
    age: 18
  }
  function fn() {
    console.log(this)
  }
  const fun = fn.bind(obj)
  console.log(fun)

应用场景

只想改变this指向,并且不想调用这个函数的

比如改变定时器内部的this指向:如果有一个按钮,当我们点击了之后就禁用这个按钮,2秒钟之后又开启这个按钮

代码语言:javascript
复制
<body>
  <button>
    发送验证码
  </button>
</body>

<script>
  const btn = document.querySelector('button')
  btn.addEventListener('click', function () {
    this.disabled = true
    window.setTimeout(function () {
      // 在这个普通函数里面,我们要this由原来的window 改成 btn
      this.disabled = false
    }.bind(btn), 2000)    //bind(btn) 等价于 bind(this)
  })
</script>

🔔总结

call()、apply()、bind()都可以改变函数内部的this指向,但是

  • call传递参数aru1,aru2...形式
  • apply传递参数arg形式
  • bind区别于其他两种,不会调用函数

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ⛳call()
    • 语法
      • 应用场景
      • ⛳apply()
        • 语法
          • 应用场景
          • ⛳bind()
            • 语法
              • 应用场景
              • 🔔总结
              相关产品与服务
              验证码
              腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档