
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, особенно когда вы хотите вызвать метод позже, но в другом контексте. Это может быть нажатие кнопки или таймер, который хочет получить доступ или даже изменить данные из другого контекста.