Поскольку counter
в setTimeout не совпадает с counter
на внешней стороне. Если вы сделаете консольный вход в систему через некоторое время, он все равно будет 0.
Это связано с областями видимости, что здесь слишком много, чтобы объяснить, но это то, что вы ищете за. Простое объяснение состоит в том, что внутри function(){}
, который теперь применяется в setTimeout()
, переменные вне этой функции не существуют.
Поскольку это не одна и та же переменная, внешняя никогда не бывает обновляется, поэтому ваш l oop никогда не прекращает добавлять больше тайм-аутов, поэтому ваш браузер никогда не останавливается.
Кроме того, в вашем текущем коде все символы будут появляться одновременно, через 1000 мс , SetTimeout не заставляет время "ждать" 1000 мс, оно просто говорит javascript "сделать это, после 1000" и затем продолжается. Вы создаете что-то вроде очереди, приказывая всем им выполнить эту задачу через 1000 мс.
Решение обеих проблем (но не забывайте о масштабах!) Заключается в использовании этих знаний в ваших интересах:
while (counter < content.length) {
setTimeout(function () {
text.textContent += content[counter];
}, 1000 * counter++)
}
Теперь мы все снова помещаем их в эту «очередь», но на этот раз мы просим каждого следующего ждать больше 1000 мс.