初学者需要捋清的JavaScript中的this指针

面向对象语言中 this 表示当前对象的一个引用。

但在 JavaScript 中 this 不是固定不变的,它会随着执行环境的改变而改变。解析器(浏览器)每次调用函数都会向函数内部传进一个隐含的参数this,this是个参数指向的是一个对象,,这个对象称为函数执行的上下文对象,根据函数的调动方式不同,this指向不同的对象

一般为以下几种情况:

  • 在方法中,this 表示该方法所属的对象。以方法形式(对象的方法)调用,this指向调用方法的哪个对象
  • 如果单独使用,this 表示全局对象。
  • 在函数中,this 表示全局对象。以函数的形式调用,this指向window
  • 在函数中,在严格模式下,this 是未定义的(undefined)。
  • 在事件中,this 表示接收事件的元素。
  • 类似 call()   ,apply()和bind() 方法可以将 this 引用到任何对象
  • 计时器(setTimeout,setInterval)中的this指向window。
  • 还有特殊的用法,在ES6中的箭头函数的this指向问题     

箭头函数的this指向

1.箭头函数在哪里定义,this就指向谁

2.也可以说箭头函数没有this

3.箭头函数外的this指向谁,箭头函数this就指向谁

下面用代码演示一下:

(1)不使用严格模式,.直接在script标签中打印this(全局模式下)

<script>
   console.log(this);
</script>

输出的是window,说明此处的this指向window

(2).严格模式下,在全局输出this。

 "use strict";
      console.log(this); //指向window

输出的仍然是window

(3).不使用严格模式,全局函数里面输出this

 function a() {
        console.log(this);
 }
  a(); 

       也是指向window。因为全局函数是window对象身上方法

(4).使用严格模式。全局函数内部的this指向是undefined

 function a() {
        console.log(this);
 }
      a(); //也是指向window。全局函数是window对象身上方法

         this的指向是undefined

(5).对象的this指向

var obj = {
        name: "汤姆",
        call: function () {
          console.log("喵喵!" + this);
        },
      };
      obj.call(); //指向调用者obj

  因为call方法是obj这个对象调用的,所以this指向obj

(6)构造函数的this指向

        构造函数用于创造对象

      function F() {
        console.log("构造函数");
        console.log(this);
      }
      var f = new F();

    构造函数的this指向 新创建的那个对象 比如上图的f

  (7).改变this指向

在一些业务逻辑中,需要我们改变this的指向,想要改变this的指向,幸运的是js为我们提供了3种方法,分别是call,bind,apply方法

<script>
        function fun() {
            console.log(this);
        }
        var obj = {
            name: '金钱豹'
        }
        var obj2 = {
            name: '金豹'
        }

        fun.call(obj);
        // 当函数调用call()和apply()都会调用函数执行
        // 在调用call和apply()都会将一个对象指定为第一个参数
        // 这两个函数帮助我们修改对象this,想要是谁就传谁给这两个函数作为形参
        fun.apply(obj2);
        // 普通调用this指向window
        // call方法可以将实参在对象之后依次传递 fun(obj,实参,实参)
        // apply()方法需要将实参封装到一个数组 apply(obj,[2,3])

        // this情况,以函数形式调用时,this指向window
        // 以方法形式调用时,this是调用方法的对象
        // 以构造函数的形式调用时,this是新创建的那个对象
        // 使用call和apply调用时,this是指定的那个对象
    </script>

  上述代码fun.call(obj)将原来this指向是window,改为指向obj

                  fun.apply(obj2)将原来this指向是window,改为指向obj

    

       当函数调用call()和apply()都会调用函数执行,在调用call和apply()都会将一个对象指定为第一个参数
       这两个函数帮助我们修改对象this,想要是谁就传谁给这两个函数作为形参
   

     有时候我们改变this指向的同时,还要传实参。  
      call方法可以将实参在对象之后依次传递 fun(obj,实参,实参)
      apply()方法需要将实参封装到一个数组 apply(obj,[2,3])

再次总结以下this指向:

           1. this情况,以函数形式调用时,this指向window
           2.以方法形式调用时,this是调用方法的对象
           3. 以构造函数的形式调用时,this是新创建的那个对象
           4.使用call和apply调用时,this是指定的那个对象

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值