JackShcherbakov
@JackShcherbakov

Почему в этом коде анонимная функция?

Здравствуйте!
Читаю учебник https://learn.javascript.ru/bind#решение-1-сделать...
Вот цитата с конца этого параграфа https://learn.javascript.ru/bind#решение-1-сделать...

[Тут они привязывают контекст через анонимную функцию.]
А что, если до срабатывания setTimeout (ведь есть целая секунда) в переменную user будет записано другое значение? К примеру, в другом месте кода будет присвоено user=(другой пользователь)… В этом случае вызов неожиданно будет совсем не тот!

Вывод - если применям анонимную функцию для привзяки контекста, то во время выжыдания таймера может измениться переменная, и в функции будет уже не то значение. Я все верно понимаю?
Если вывод выше верен, тогда почему в этой задаче применяется анонимная функция не смотря на то, что в этом же учебнике была описана проблема выше. https://learn.javascript.ru/getters-setters#создат...
То есть им надо обеспечить такое, что бы приожидании таймера могли происходить любые изменения над функцией. Разве это не противорнчит выводу выше? Затем, почему нельзя сделать так:
/**Кусок кода*/
....
  this.run = function() {
    setTimeout(onReady.bind(this), getTimeToBoil());
  };
.....

Даже прелставить не можете, как я буду благодарен тому, кто выведет меня из этого ступора.
  • Вопрос задан
  • 194 просмотра
Решения вопроса 2
SPAHI4
@SPAHI4
реактовцы - это не девы, а прокидыватели пропсов
В js по-умолчанию this в исполняемой функции - текущий контекст. На примере, если просто выполнить функцию onReady, то ее контекст (this) будет функция setTimeout. Это решается 3 вариантами:
1. Если доступно замыкание, то
....
  this.run = function() {
  var self = this;
    setTimeout(function onReady() {
    self.doSomething();
  }, getTimeToBoil());
  };
.....

2. пример с .bind(this)
3. Используем es2015 arrow function, где this не перезаписывается, а берется из замыкания
....
  this.run = function() {
    setTimeout(() => {
    this.doSomething();
  }, getTimeToBoil());
  };
.....
Ответ написан
Комментировать
dimmond_pro
@dimmond_pro
Jedi
В данном примере проблема не в контексте функции onReady, поэтому нет смысла привязывать к ней контекст. В этом примере они как раз-таки и используют возможность изменять замкнутую функцию, чтобы всякий раз ее вызывая, получать разный результат. Ваши выводы верные, но вы упускаете тот факт, что проблема здесь только на руку разработчику, потому что вызывая setOnReady он меняет сообщение, которое увидит пользователь
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
summer Ярославль
от 100 000 до 140 000 ₽
КРАФТТЕК Санкт-Петербург
от 60 000 до 80 000 ₽
19 апр. 2024, в 22:48
100 руб./за проект
19 апр. 2024, в 20:43
20000 руб./за проект