0

var obj = {
  a: 0,
  foo: function() {
    setTimeout(function() {
      this.a = 2;
    }, 200);
    setTimeout(function() {
      console.log(this.a);
    }, 100);
  },
};

var i = 0; while (i < 2) { setTimeout(function() { obj.foo(); }, 200 * i); i++; }

Я хочу понять, почему код выдает именно такой результат?

Xzet
  • 1
  • что-то в сниппете не воспроизводится. Точно этот код давал поведение? – Grundy Oct 31 '18 at 10:42
  • Ой, извиняюсь, во втором setTimeout задержка не 100 а 200, ну то есть вот так:

    var obj = { a: 0, foo: function() { setTimeout(function() { this.a = 2; }, 200); setTimeout(function() { console.log(this.a); }, 100); }, };

    var i = 0; while (i < 2) { setTimeout(function() { obj.foo(); }, 200 * i); i++; }

    – Xzet Oct 31 '18 at 11:03
  • ты можешь отредактировать вопрос исправив код. Плюс добавь ожидаемое поведение. – Grundy Oct 31 '18 at 11:05
  • Посмотри ссылку на дубликат, тогда стане понятно, почему первый вывод - undefined – Grundy Oct 31 '18 at 11:16
  • Прочитал, но все же я не понимаю, почему первый вывод - undefined, а не 0, значение которое задали до свойства-функции foo? – Xzet Oct 31 '18 at 14:08
  • Так как контекст потерялся, и this в момент вызова console.log указывает не на obj, у которого есть свойство a, а на window, у которого этого свойства может не быть. Почему контекст потерялся - описано в вопросе дубликате. – Grundy Oct 31 '18 at 14:10

0 Answers0