Java и JavaScript имеют некоторые общие черты, но большинство из них реализуются по-разному. Одним из примеров этого является this. В основном это относится к определенному контексту, а это означает, что некоторые переменные доступны только в этом контексте.

Ява — это

В Java this используется для доступа к переменным-членам. Поэтому он используется для доступа к контексту класса:

class ThisClass {
  private int someValue;
  public void setSomeValue(int someValue) {
    this.someValue = someValue;
  }
  public int getSomeValue() {
    return this.someValue; // works without 'this'
  }
  public static void main(String[] args) {
    ThisClass thisClass = new ThisClass();
    System.out.println(thisClass.getSomeValue()); // 0
    thisClass.setSomeValue(42);
    System.out.println(thisClass.getSomeValue()); // 42
  }
}

Таким образом, в Java, особенно в функциях установки, параметр часто имеет имя переменной, для которой он предназначен. В этом примере someValue неоднозначно, поэтому this имеет смысл. Геттер работает без this, потому что в этом контексте нет двусмысленности.

JavaScript — это

В JavasScript this относится к «контексту вызова». Если вы используете его внутри функции, вы получите доступ к ее объекту (в данном примере bigObject).

function test() {
  console.log(this);
}
const test2 = () => console.log(this);
const bigObject = {
  someValue: 42,
  test,
  test2
}
bigObject.test();
/*
{ someValue: 42,
  test: [Function: test],
  test2: [Function: test2] }
*/
bigObject.test2();
/*
{}
*/

В JavaScript есть много других мест, где используется this. Например, в обработчиках событий HTML this относится к полученному событию. Связывание в JavaScript — это отдельная тема, но вкратце вы можете взглянуть на последний пример:

const foo = { someValue: 1 };
const test = bigObject.test.bind(foo);
test(); // { someValue: 1 }

В этом примере мы меняем контекст this метода test() внутри bigObject на foo. Это важная концепция в JavaScript, особенно когда вы хотите вызвать метод позже, но в другом контексте. Это может быть нажатие кнопки или таймер, который хочет получить доступ или даже изменить данные из другого контекста.