this 的用法

this 的基础用法

this 的值:

  • 非严格模式下,总是指向一个对象
  • 在严格模式下,可以是任意值
  1. 全局上下文:无论是否在严格模式下,在全局执行环境中(在任何函数体外部)this 都指向全局对象。
// 在浏览器中, window 对象同时也是全局对象:
console.log(this === window); // true

a = 37;
console.log(window.a); // 37

this.b = "change";
console.log(window.b)  // "change"
console.log(b)         // "change"

运行效果如下所示:
https://gitee.com/project_almanac/change/raw/master/JavaScript/iTap5XxNyNdY.png

  1. 函数上下文:this 的值取决于函数被调用的方式
function f1(){
  return this;
}
//在浏览器中:
f1() === window;   //在浏览器中,全局对象是window

//在Node中:
f1() === globalThis;  
  1. 类上下文:类的本质也是函数,但也有些不同,在类的构造函数中,this 是一个常规对象。类中所有非静态的方法都会被添加到 this 的原型中:
class Example {
  constructor() {
    const proto = Object.getPrototypeOf(this);
    console.log(Object.getOwnPropertyNames(proto));
  }
  first(){}
  second(){}
  static third(){}
}

new Example(); // ['constructor', 'first', 'second']
  1. 派生类:不像基类的构造函数,派生类的构造函数没有初始的 this 绑定。在构造函数中调用 super() 会生成一个 this 绑定,并相当于执行如下代码,Base 为基类:
this = new Base();

派生类不能在调用 super() 之前返回,除非其构造函数返回的是一个对象,或者根本没有构造函数。

class Base {}
class Good extends Base {}
class AlsoGood extends Base {
  constructor() {
    return {a: 5};
  }
}
class Bad extends Base {
  constructor() {}
}

new Good();
new AlsoGood();
new Bad(); // ReferenceError
uctor() {}
}

new Good();
new AlsoGood();
new Bad(); // ReferenceError

版权声明:本文为weixin_46229298原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。