2012-05-29 3 views
1

Я получаю бесконечный цикл из-за этого небольшого фрагмента кода. Он становится фиксированным, если я объявлял var i любому значению (т. Е. Var i = 0) до цикла, и я не уверен, почему. Может ли кто-нибудь, кто знаком с хитростями javascript, объяснить мне, что здесь происходит?бесконечный цикл javascript, вызванный простыми для цикла

for (num = 1; num <= 2; num++) { 
    for (i = 1; i < num; i++) { 
     console.log("hi"); 
    } 
} 
+1

Здесь нет бесконечной петли. Печатает «привет» один раз (Chrome 19.0.1084.52 m) – KooiInc

+0

Кажется, все отлично. НЕТ БЕСКОНЕЧНЫХ ЛЮБОВ !!! –

+0

это не бесконечно. – Joseph

ответ

1

код, кажется, просто отлично, увидеть его в действии на jsFiddle here.

Другое примечание: будьте осторожны с переменными в javascript. Вы должны всегда использовать var, чтобы объявить их; если вы забудете, что они станут глобальными!

0

Это не должно быть бесконечно, но вот случай, который может произойти.

Доступ к i без объявления var означает, что вы используете его как глобальную переменную, а не локальную. Постарайтесь тщательно проанализировать свой код, чтобы узнать какие-либо глобальные «i» или «num», которые мешают вашему циклу.

3

С i не был объявлен как местный var, ваш код, в последействия изменяющие переменные/объекты window.i, а также window.num

Добавление var ключевые слова должны решить эту проблему:

for (var num = 1; num <= 2; num++) { 
    for (var i = 1; i < num; i++) { 
     console.log("hi"); 
    } 
} 

Этот не отвечает на вопрос, почему программа переходит в бесконечный цикл. Но вы только знаете, что висящий код пытался изменить window.i и window.num, которые могут быть использованы в другом месте.

Подробнее о Правила использования javascript.

+0

На самом деле будет интересно узнать, какие глобальные переменные переписываются кодом. Если возможно, используйте * firebug *, чтобы поставить точки останова непосредственно перед входом в внешний цикл. Затем используйте окно * watch *, чтобы увидеть значения переменных 'i' и' num', чтобы увидеть, что они содержат, прежде чем код изменяет их. Интересно, почему его висит. –

+0

btw, он попадает в бесконечный цикл или бросает его, а ошибка и останавливает выполнение. См. Консольную ошибку или просто выполните код. –

+0

Я понял, что происходит не так, это был не бесконечный цикл внутри цикла for, а бесконечное призвание функции, которая содержала его. Это связано с тем, что моя функция вызывается в цикле for, которая также использовала var i, а цикл for внутри моей функции продолжал изменять это значение, поэтому цикл for, который вызывал мою функцию, никогда не выходил. – Vadoff