Js中this指向和改变this指向

1,078 阅读1分钟

前言

今天谈一谈JavaScript中各种情况下this的指向问题,以及怎么改变this的指向。


一、this指向

1、各种情况下的this指向

  1. 以函数形式调用时,this 永远都是 window
  2. 以方法的形式调用时,this 是调用方法的对象
  3. 通过构造函数创建实例对象的时候,this永远指向创建的实例对象
  4. 严格模式下,普通函数this指向为undefined
  5. 箭头函数:箭头函数没有this,如果非说有this的话,那么它的this指向所在作用域的this

2、代码演示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=`, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 以函数形式调用
        function f1(){
            console.log('函数形式调用this指向',this)
        }

        f1()

        // 方法形式调用
        let cat = {
            name:'咪咪',
            age:2,
            say:function(){
                console.log('方法形式调用this指向',this)
                console.log(this.name + '喵呜~')
            }
        }
        cat.say()

        // 构造函数
        function Person(){
            this.name  = "leo"
            this.age = 23
            console.log('构造函数中this指向',this)
        }

        let man = new Person()


      // 箭头函数
      let dog = {
          name:'小乐',
          age:3,
          say:function(){
              setTimeout(() => {
                  // 定时器不使用箭头函数写法时,this指向window
                  // 定时器使用箭头函数写法时,this指向箭头函数所在作用域的this
                  console.log('箭头函数中的this指向',this)
                  console.log(this.name + '汪汪')
              }, 1000);
          }
          
      }
      dog.say()

    </script>
</body>
</html>

3、结果展示

在这里插入图片描述

二、改变this指向

1.方法

call()

代码如下(示例):

function obj(a,b){
  console.log(this,a,b)
}

let a = {name: "leo",age: 23}

obj.call(a,1,2)

apply()

代码如下(示例):

function obj(a,b){
  console.log(this,a,b)
}

let a = {name: "leo",age: 23}

obj.apply(a,[1,2])

bind()

代码如下(示例):

function obj(a,b){
  console.log(this,a,b)
}

let a = {name: "leo",age: 23}

obj.bind(a,1,2)()

2、相同点

三种方法都可以改变this的指向
第一个参数都是this指向的对象

3、区别

  1. 函数执行 call和apply:都会使函数执行 bind:不会使函数执行,会返回一个改变了this指向的函数,所以加上()调用
  2. 传递参数 apply:第二个参数只能是一个数组,函数有几个形参就向数组中传几个实参 call和bind:函数有几个形参,就继续从第二个参数往后写

总结

觉得有用的话,记得点赞收藏哟~