Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Переменные внутри цикла (https://javascript.ru/forum/misc/46142-peremennye-vnutri-cikla.html)

alexan0308 30.03.2014 11:40

Переменные внутри цикла
 
Строю кривую, для этого в цикле забиваю массив geometry трехмерными точками ( класс Vector3 ). Хочется для наглядности написать:

for (var t = 0; t <= 30; t+= 0.1)  
{
     var x = a*Math.cos( t );
     var y = a*Math.sin( t );
     var z = b*t;

     var vec = new Vector3( x, y, z );
     geometry.push( vec );
}


Вопрос, возникает ли при этом 3*300 = 900 переменных (из-за x,y,z) ? Страдает ли производительность? Лучше так?

for (var t = 0; t <= 30; t+= 0.1)  
{
     var vec = new Vector3( a*Math.cos( t ), a*Math.sin( t ), b*t );
     geometry.push( vec );
}

Просто я подозреваю, что в Javacsript нет такой проблемы, там переменные сами исчезают. Или не так, и лучше использовать второй код? Или нужно в духе Паскаля:
var x,y,z;
for (var t = 0; t <= 30; t+= 0.1)  
{
     x = a*Math.cos( t );
     y = a*Math.sin( t );
     z = b*t;

     var vec = new Vector3( x, y, z );
     geometry.push( vec );
}


Есть ли разница в Javascript между первым и третьим кодом?

jsnb 30.03.2014 11:51

Если вы боитесь, что на каждой итерации цикла var создаст новую переменную, то напрасно. Переменная создается только 1 раз, а дальше ей просто будут присваиваться разные значения. Так что разницы между первым и третьим вариантом нет.

alexan0308 30.03.2014 11:57

Цитата:

Сообщение от jsnb (Сообщение 305114)
Если вы боитесь, что на каждой итерации цикла var создаст новую переменную, то напрасно. Переменная создается только 1 раз, а дальше ей просто будут присваиваться разные значения. Так что разницы между первым и третьим вариантом нет.

Ок, спасибо! Я так и подозревал, поскольку часто встречал такие цыклы...

jsnb 30.03.2014 11:59

Причем надо понимать, что переменные объявленные через var создаются еще на этапе инициализации скрипта т.е. до выполнения кода. А во время выполнения идет уже только присваивание.

Aetae 30.03.2014 17:05

Я люблю делать так:
for (var t = 0, x, y, z; t <= 30; t+= 0.1){ 
     x = a*Math.cos( t );
     y = a*Math.sin( t );
     z = b*t;
 
     geometry.push( new Vector3( x, y, z ) );
}

Но наделе действительно разницы нет.

nerv_ 30.03.2014 17:22

Цитата:

Сообщение от alexan0308
Хочется для наглядности написать:

так и пиши :)

Цитата:

Сообщение от alexan0308
Вопрос, возникает ли при этом 3*300 = 900 переменных (из-за x,y,z) ?

объектов создастся 30/0.1
переменные x, y, z будут перезаписаны на 2+ итерациях


Часовой пояс GMT +3, время: 06:41.