Понимание JavaScript: это ключевое слово, часть 2
В своей предыдущей статье я рассмотрел, как может различаться значение this
в зависимости от контекста, в котором оно было вызвано. Часть 2 покажет краткий обзор того, как this
в стрелочных функциях не следует этим четырем правилам, изложенным в части 1.
Стрелочная функция обозначается не ключевым словом function
, а =>
, оператором «толстая стрелка». Функция стрелки принимает привязку this
из вмещающей (функциональной или глобальной) области. Давайте посмотрим на пример:
function foo () { return a => console.log(this.a); } const obj1 = { a: 2 }; const obj2 = { a: 3 }; const bar = foo.call(obj1); bar.call(obj2); // 2
Стрелочная функция в foo
лексически захватывает значение this
foo
при вызове obj1
. Поскольку foo
была this
привязана к obj1
, bar
(ссылка на возвращаемую стрелочную функцию) также будет this
привязана к obj1
и не может быть переопределена путем вызова этой функции для obj2
. Лексическая привязка стрелочной функции также не может быть переопределена ключевым словом new
.
Наиболее распространенный вариант использования, скорее всего, используется в обратных вызовах, таких как обработчики событий или таймеры. Например:
function foo() { setTimeout(() => { // `this` here is lexically adopted from `foo()` console.log( this.a ); }, 100); } var obj = { a: 2 }; foo.call( obj ); // 2
Причина, по которой мы должны знать это в контексте стрелочных функций и четырех правил в моей первой статье, заключается в том, что мы знаем, каково значение this
в разных контекстах. Знание этого правила также помогает вам знать, что значение this
не будет случайно перезаписано вашим собственным кодом или сторонними библиотеками.