@EarthFM

Не могу понять решение задач(js)?

1. Почему получается 10 раз по 10
2. Почему выводится Вася

//1
    for(var i=0; i<10; i++) {
      setTimeout(function() {
        alert(i);
      }, 100);
    }
    
//2
    var name = "Вася";
    function sayHi() {
      alert(name);
    }
    
    setTimeout(function() {
      var name = "Петя";
      sayHi();
    }, 1000);
  • Вопрос задан
  • 940 просмотров
Решения вопроса 2
abyrkov
@abyrkov
JavaScripter
Это области видимости JS.
Первая - i, когда выполняется функция(через 0.1 сек) уже 10
Вторая - функция как бы сохраняет видимость тогда, когда она создана. Проще говоря, когда функция создавалась, она была глобальной и выводит name глобальной. А в коде вы объявляете локальную переменную name и присвоит ей Петя. Но глобальная переменная name все еще Вася, поэтому выводится Вася.

Понятно?
Ответ написан
khipster
@khipster
Я подведу итог для тех кто наткнётся на этот вопрос через поиск.

1. Неверно дают ответ что мол цикл успевает досчитать до 10. Цикл может продолжаться сколько угодно, но в очереди он стоит первым и поэтому пока он не закончится отложенная функция не сработает. Такая вот асинхронность в js: одна большая очередь за молоком из которой ты можешь только выпасть в самый конец, а асинхронно отойти покурить, а потом попытаться пролезть вперёд какой нибудь бабульки не получится, т.к. огреет бидоном по башке.

2. При создании функция получает скрытое свойство [[Scope]], которое ссылается на лексическое окружение, в котором она была создана. Это свойство никогда не меняется. Оно всюду следует за функцией, привязывая её, таким образом, к месту своего рождения. Поэтому sayHi() выводит "Васю". Как говорится где родился - там и пригодился.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы