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