Ключевое слово JavaScript это
является источником боли для многих людей. Общий вопрос идет что-то вроде этого:
«Я делаю позвонить функцию FireBase, а внутри этого обратного вызова мне нужно получить доступ к этому, чтобы обновить моим реагированным компонентом».
Другим распространенным делом является Settimeout:
«Проблема в том, что STATIMEOUST принимает обратный вызов, но мне нужно получить доступ к этому, а Settimeout меняет это!»
Основное руководство
В нормальных обстоятельствах это
относится к тому, что слева от точек в CallTime Отказ Есть несколько исключений, которые специально изменили поведение этого- Позвоните
, Применить
и привязывать
Отказ Если вы не использовали одну из этих функций, чтобы изменить поведение этого, а затем посмотрите на левую часть точки в COOL.
Пример
var alarm = { ringer: function () { console.log("The " + this.color + " alarm: Ring!!!"); }, color: "red" } alarm.ringer();
Это довольно быстро. Когда вы звоните Alarm.ringer ();
, вещь слева от точки – тревоги
Отказ Итак, внутри функции Рингера это
Является ли аварийный сигнал и цвет красный.
Ошибка в обратном вызове Settimeate
var alarm = { ringer: function () { console.log("The " + this.color + " alarm: Ring!!!"); }, set: function (milliseconds) { setTimeout(function () { this.ringer() }, milliseconds); }, color: "red" } alarm.set(2000);
Целью здесь было то, что сигнал тревоги будет звонить через две секунды. К сожалению, мы получаем эту ошибку:
Причина в том, что уютные вызовы вызывают обратный вызов в него. Основываясь на ошибке, мы видим, что функция SettimeOut создана A Тайм-аут
Объект и хранится функция обратного вызова, которую мы передали в нее как Timeout._ontimeout
Отказ И В то время его называли , вещь слева от точки – это время ожидания, а не тревоги.
Классическое решение
Способ того, что «эта» проблема традиционно решена, присваивая «это» из внешнего объема на новую переменную, называемую либо «_Эта», либо «что».
var alarm = { ringer: function () { console.log("The " + this.color + " alarm: Ring!!!"); }, set: function (milliseconds) { var that = this; setTimeout(function () { that.ringer() }, milliseconds); }, color: "red" } alarm.set(2000);
Теперь это работает. Поскольку значение «это» внутри Установить
Функция – это тревога, а что
это просто обычная переменная. Поскольку функции могут получить доступ к переменным из их окружающей массы, Это.рингер ()
Внутри обратного вызова это Alarm.ringer ()
Отказ
The red alarm: Ring!!!
Функция функции стрелки ES6
ES6 Arrow Функции Не работай совсем так же как обычные функции выражения. У них нет собственных привязки к «этому», поэтому любые ссылки на «это» используют привязки от ограждающей функции.
let alarm = { ringer: function () { console.log("The " + this.color + " alarm: Ring!!!"); }, set: function (milliseconds) { setTimeout(() => { this.ringer() }, milliseconds); }, color: "red" } alarm.set(2000);
Поскольку ссылка MDN выше упоминается, функции стрелки плохо подходят для методов, но они удобны для упрощения обратных вызовов. В 2019 году большинство JS devs используют функции arrow для решения этой проблемы и встречаются только на «шаблон в библиотеках и устаревших кодах.
Первоначально опубликовано в https://logicmason.com 16 апреля 2019 года.