Подтвердить что ты не робот

While (true) vs setInterval (function(), 0)

setInterval()

Вызывает функцию или выполняет фрагмент кода несколько раз, с фиксированной временной задержкой между каждым вызовом этой функции.

в то время как()

Создает цикл, который выполняет указанный оператор, если условие теста оценивается как true. Условие оценивается до выполнение инструкции.

Если я использую while(true) для выполнения определенного оператора, мой браузер либо сбой (Firefox), lags ( Opera), либо оператор не будет выполнен ( Chrome), но если я использовал setInterval() с фиксированным временем 0 секунд, все работает отлично, хотя его только 0 секунд и while(true) t логически быстрее, чем 0 секунд, но почему это происходит?

while() пример:

<!DOCTYPE html>
<html>
    <body>
        <div id="counter"></div>
        <script>
            var i = 0;
            while (true)
            {
                document.getElementById("counter").innerHTML += i++; 
            }
        </script>
    </body>
</html>

setInterval() пример:

<!DOCTYPE html>
<html>
    <body>
        <div id="counter"></div>
        <script>
            var i = 0;
            setInterval(function() { counter() }, 0);
            function counter()
            {
               document.getElementById("counter").innerHTML += i++;
            }
        </script>
    </body>
</html>
4b9b3361

Ответ 1

Существует большая разница, которая связана с блокировкой. Первый подход, цикл while будет блокировать процессор пользователя, потому что он работает вечно без остановки и займет 100% процессора. setInterval имеет минимальную сумму, которая неявно и зависит от браузера. Я считаю, что это около 10 мс. Таким образом, ваш setInterval на самом деле работает всего миллисекунду или так делает это простое обновление каждые 10 мс. Это жестко на процессоре, но не потребует 100% процессора и может быть смягчено с помощью управления задачами операционной системой.

Ответ 2

Javascript в браузерах однопоточный и управляемый событиями. Никакие две вещи не выполняются одновременно, никогда, а цикл событий - король. Если ваш JS никогда не отказывается от контроля одного потока (заканчивая функцию), то ничто другое не может использовать поток. Тот же поток обрабатывает JS и DOM, поэтому пользователь не может даже прокручивать или нажимать на что-либо, если ваш JS забивает поток.

setInterval (или действительно setTimeout) с задержкой 0 (миллисекунды, а не секунды) означает только добавление этой функции в очередь событий после заданной задержки, нет гарантии, что функция будет выполняться при этом время.

EDIT: на самом деле веб-работники могут запускать JS одновременно с основным потоком браузера, но они не видят ни одной из этих же памяти/не могут получить доступ к DOM, поэтому точки/предположения выше все еще сохраняются, вроде... Если вы хотите попасть в веб-работников, вам понадобится довольно хорошее понимание JS/функционального программирования.

ИЗМЕНИТЬ (снова): Почему вы хотите навсегда? Если вы проводите опрос (я могу думать только о причине), пожалуйста, не делайте этого. Там почти всегда лучший способ, особенно в JS. Функциональный способ состоит в том, чтобы определить функцию, которую вы хотите выполнить при возникновении события (предмет, на который вы проводили опрос), а затем присоединить эту функцию к событию (как вы это делаете, зависит от события).

Ответ 3

  • while(1) генерирует бесконечный цикл, т.е. JavaScript будет просто запускаться вечно и никогда не будет отдавать управление браузеру, что задерживает его, потому что он больше не может ничего делать (до script убит).

  • setTimeout(func, 0) ведет себя по-разному в том смысле, что после его выполнения управление возвращается браузеру, который затем может решить, что делать после. Установка 0ms в setTimeout не гарантирует, что код JavaScript запускается сразу после его остановки. С параметром 0ms вы просто указываете браузеру, что вы хотите, чтобы код запускался сразу после его остановки, но браузер может свободно делать что-то еще, прежде чем это делать.

Ответ 4

while (true) блокирует любое выполнение до тех пор, пока не будет завершен условный цикл, о котором мы уже знаем, никогда не произойдет. (Хром)

setInterval сообщает среде выполнять произвольный код каждые x миллисекунд, он не блокирует ваш браузер, потому что у "планировщика" все еще есть элемент управления.

Ответ 5

Есть ли у вас конкретная причина использовать бесконечный цикл и даже манипулировать DOM с каждым каждым шагом?

Если вы используете цикл while, скорее всего, он полностью заблокирует браузер и клиент, что также приведет к возможной перегрузке процессора, если это не будет прекращено.

Цикл while пытается завершить работу в течение наиболее минимальных микросекунд. Поэтому он может даже попытаться выполнить миллион шагов в течение возможной секунды, а может быть, даже больше, в этом случае это зависит от клиента. Однако при такой скорости обновление DOM было бы невозможным.

В случае для setInterval он сильно отличается от цикла while, по сути, более целесообразно называть его function repeater. Он повторяет заданную функцию по прошествии данного времени. Поэтому, даже если время равно 0, он имеет шаг, на котором он проверяет if the waiting time has passed now, and should the next repeat be run.

Таким образом, вы можете считать while более мгновенным, чем задержка в 0 секунд.