JavaScript中this指向的十种情况

1.this----->undefined
ES6的严格模式中,日过调用函数中的this或者顶层this将会指向undefined;

2.this----->window
(1)非严格模式中函数或者顶层中调用this,会被指向window;
(2)毁掉函数中默认this的指向是window;
(3)当使用call,apply,bind,如果代入得第一个参数是null或者undefined时,this默认会被指向window;
3.this----->上下文环境中的this
(1)箭头函数

        var obj={
            a:function(){
                setTimeout(()=>{
                    this.b();//this就是当前箭头函数外上下文中this指向
                    // setTimeout外面的this是什么这个箭头函数中的this就是什么
                },500)
                document.addEventListener("click",e=>{
                    this.clickHandler(e);
                    // 这里的this指向addEventListener函数外上下文环境中this的指向
                })
            },
            b:function(){
                console.log("aaa")
            },
            clickHandler:function(e){
            }
        }

(2)对象的属性中this也是上下文环境中this的指向

        var c=20;
        var obj={
            c:10,
            a:this.c,
            b:function(){
                console.log(this.a)
            }
        }
        obj.b();
打印结果为20
        var a = 100;
        var obj = {
            a: 10,
            c: 50,
            b: {
                a: 0,
                c: this.a,
                run: function () {
                    console.log(this.c);
                }
            }
        }

        obj.b.run();
        打印结果为100

4.this —>document

          var obj={
              a:10,
              c:50,
              b:{
                  a:0,
                  c:this.a,
                  run:function(){
                      console.log(this.c);
                  }
              }
          }
          obj.b.run();
      }

5.this----->函数中的arguments
在函数中使用回调函数时,利用arguments的参数来执行回调函数,被执行的回调函数中this指向的是当前函数arguments.callee,.caller的arguments;
例一:

        // fn中的this是fn1中arguments
        var a;
        function fn() {
            console.log(this === a);
        }
        function fn1(f) {
            a = arguments;
            arguments[0]();
        }
        fn1(fn);

例二:

        var o = {
            a: function () {
                console.log(this);
            },
            b: function (f) {
                arguments[0]();
            },
            c: function () {
                this.b(this.a)
            }
        }
        o.c();

6.事件中的this----->事件侦听的对象e.currentTarget

      document.addEventListener("click",clickHandler);
      function clickHandler(e){
          console.log(this);//document
      }

7.this被call,apply和bind重新指定对应的对象;

8.对象函数中的this----->当前对象

      var obj={
          a:1,
          b:function(){
              console.log(this);//当前对象
          }
      }

9.ES6类中this----->实例化对象

      class Box{
          constructor(){
              console.log("aaa");
          }
          // 实例化方法,在实例化方法中或者构造函数中调用的this都是当前类的实例化的对象
          play(){
              console.log(this);//this是当前类实例化的对象
          }
          // 静态方法中,this就是当前类名或者当前类的构造函数
          static run(){
              console.log(this);//this是当前类也是构造函数
              console.log("aaaa");
          }
      }
        // console.log(Box); //这个Box是类也是函数
        // 当直接调用是指的是类
        // new Box(); //执行构造函数 Box就是类里面的constructor
        // var b = new Box();
        // b.constructor.run();
        // Box.run();
        // console.log(b.constructor) //只有实例化对象才有属性是constructor
        // console.log(b.constructor === Box);

        // 在ES5或者ES6中,类仅允许有且仅有一个构造函数,并且该函数的名称和类名相同
        // 在ES6中会将构造函数描述成constructor
        // 在ES5中会将构造函数写出类名
        // 但是不管是ES5还是ES6,实例化对象的constructor都是构造函数,
        // 构造函数中不允许return

10.ES5类中的this

          function Box(){
              // console.log("aaa");
              // this   通过new 实例当前Box时,this就是当前实例化的对象
              // this  如果直接调用函数,this就是window或者undefined(严格模式)
              if(!(this instanceof Box)){
                  return new Box();
              }
          }
          // 相当于ES6类中实例化方法
          Box.prototype.play=function(){
              console.log(this);//实例化的对象
          }
         // 相当于ES6中的静态方法
          Box.run=function(){
              console.log(this);//就是当前类
          }
          // Box是类也是构造函数
          var b=new Box();//当执行实例Box时会执行Box函数,并且自动返回实例化Box的一个元素
         var c=Box();//在ES5中如果不使用new来执行构造函数,构造函数自身也是可以独自执行,但是不能返回实例化对象
          console.log(b,c);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值