Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Хорошо ли писать var в цикле? (https://javascript.ru/forum/misc/14728-khorosho-li-pisat-var-v-cikle.html)

балерун 28.01.2011 12:02

Хорошо ли писать var в цикле?
 
Нежелательно объявлять переменную в цикле? Или ресурсы, которые тратятся на проверку, создана ли переменная, очень малы?

Меня интересует, как правильнее писать, так:
for (var i = 0; i < 10; i++) {
    var u = some_function();
}

или так:
var i, u;
for (i = 0; i < 10; i++) {
    u = some_function();
}

Тоже самое с циклом for(.. in ..)
Так:
for (var prop in obj) {}

или так:
var prop;
for (prop in obj) {}


Сорри, за такой мелочный вопрос :)

Vulkan 28.01.2011 12:05

Я обычно всегда сначала объявляю переменную, а затем уже в цикле использую, думаю так правильнее.

Skipp 28.01.2011 12:16

если я не ошибаюсь разница только в количестве символов

Kolyaj 28.01.2011 12:19

Лучше первое. Переменная объявляется там, где начинает использоваться. В семантике и в скорости разницы нет.

PeaceCoder 28.01.2011 12:42

Цитата:

Сообщение от Kolyaj
В семантике и в скорости разницы нет.

Я вот не помню но разница вроде есть. Пример: надо использовтьпеременную в 2ух разных вариантах (всмысле она может содержать разные данные) и если ее обьявлять после проверки, то интерпретатор напишет(?), что переменная необьявлена или же потянется к глобальным переменным.

Kolyaj 28.01.2011 12:54

Цитата:

Сообщение от PeaceCoder
Пример: надо использовтьпеременную в 2ух разных вариантах (всмысле она может содержать разные данные) и если ее обьявлять после проверки, то интерпретатор напишет(?), что переменная необьявлена или же потянется к глобальным переменным.

Чего?

ksa 28.01.2011 13:09

Цитата:

Сообщение от Kolyaj
Лучше первое. Переменная объявляется там, где начинает использоваться.

А если потом будут чего-то дописывать? :D
Я все объявляю в самом начале... Мало того! Такая практика на том же COS даёт лучший контроль выделения оперативной памяти.

Kolyaj 28.01.2011 13:33

Цитата:

Сообщение от ksa
А если потом будут чего-то дописывать?

И что?

Цитата:

Сообщение от ksa
Мало того! Такая практика на том же COS даёт лучший контроль выделения оперативной памяти.

Что такое COS и как ваша практика помогает выделению оперативной памяти?

ksa 28.01.2011 13:51

Цитата:

Сообщение от Kolyaj
И что?

Твое объявление в цикле придется таки переносить... :D
Цитата:

Сообщение от Kolyaj
Что такое COS

Каше Обжект Скрипт
http://docs.intersystems.com/cache20...e.cls?KEY=TCOS

Цитата:

Сообщение от Kolyaj
и как ваша практика помогает выделению оперативной памяти?

Несколько определений подряд (и уш особенно в цикле :) ) съедают больше памяти

NO // Плохой пример
   n a
   n b
   n c
   // Остальной код
   q

YES // Хороший пример
   n a,b,c
   // Остальной код
   q


Это к тому что нужно тексты писать т.с. кроссязычно. :)

Kolyaj 28.01.2011 13:52

Цитата:

Сообщение от ksa
Твое объявление в цикле придется таки переносить...

Зачем? Объявление в цикле ничем не отличается от объявления в начале функции.

Цитата:

Сообщение от ksa
Каше Обжект Скрипт

И причём здесь JavaScript?

ksa 28.01.2011 13:54

Цитата:

Сообщение от Kolyaj
И причём здесь JavaScript?

Цитата:

Сообщение от ksa
Это к тому что нужно тексты писать т.с. кроссязычно

Непонятно? :)

Kolyaj 28.01.2011 13:56

Нет, непонятно. У каждого языка свой синтаксис и своя семантика. Какой смысл вкладывается в кроссязычность, непонятно.

ksa 28.01.2011 13:57

Цитата:

Сообщение от Kolyaj
Какой смысл вкладывается в кроссязычность, непонятно

кроссязычный текст может понять специалист другого языка и сделать необходимые "правки" или "дописки"...

ksa 28.01.2011 13:58

Цитата:

Сообщение от Kolyaj
У каждого языка свой синтаксис и своя семантика

Фор он и в Африке Фор, как Иф и т.д.... ;)

Kolyaj 28.01.2011 13:59

Цитата:

Сообщение от ksa
Фор он и в Африке Фор, как Иф и т.д

Си: переменные, объявленные внутри цикла доступны только в этом цикле.
javascript: переменные, объявленные внутри цикла доступны вне этого цикла.

Matre 28.01.2011 16:06

Цитата:

Си: переменные, объявленные внутри цикла доступны только в этом цикле.
это уже относиться к переменым а это другой вопрос
в хаскеле их напремер вобще нет
т е переменые,функции и вобще объекты-в каждом языке разные
но фор,иф,вайл,до..вайл визде оденаковые

но вы все-равно правы,крос-язычность это бред сивой кобылы

Skipp 28.01.2011 16:19

ахренеть, как такая мелочь может вызвать споры:)

ksa 28.01.2011 16:23

Цитата:

Сообщение от Skipp
как такая мелочь может вызвать споры

- А в том дело, что мы - народ легкий, заводной. (с) Трушкин

Это не споры, это дебаты. :D

Skipp 28.01.2011 16:25

ksa,
да тут даже дебаты не о чем проводить, всё уже давно в scope =)

micscr 28.01.2011 17:32

Классический пример неудобства такого объявления - во Фленагане:
var scope = 'глобальная';
function f(){
  alert(scope); // !!! "undefined"
  // ...
  var scope = "локальная";
  

}


Для параметров циклов конечно пойдет. А так - зачем?

x-yuri 28.01.2011 20:44

сколько вы тут всего понаписывали... дайте покомментировать :)

Цитата:

Сообщение от Vulkan
Я обычно всегда сначала объявляю переменную, а затем уже в цикле использую, думаю так правильнее.

правильно - это не аргумент

Цитата:

Сообщение от ksa
Это к тому что нужно тексты писать т.с. кроссязычно.

это все равно, что "не используйте специфические возможности БД". Да и языки... они такие разные. Это просто невозможно, в идеале. Но конечно же имеется некоторый вменяемый, неозвученный круг языков, в пределах которых надо писать кроссязычно, этакий Common Language Runtime. Правда вот вопрос о том, каким боком какой-то левый программист правит код на языке, которого он не знает, мягко говоря умалчивается. Не, ну понятно, у тебя просто приоритеты другие. Но лично я считаю, что лучше заботиться о том, чтобы код был понятен твоим коллегам, а не всему миру :)

Цитата:

Сообщение от micscr
Классический пример неудобства такого объявления - во Фленагане:

да, этот тот самый единственный пример фейла Флэнагана :lol:

Vulkan 28.01.2011 21:27

Цитата:

Сообщение от x-yuri (Сообщение 90264)
правильно - это не аргумент

Хорошо, аргументирую - я считаю что лучше объявить переменную раз, а потом уже пользоваться в цикле, чем объявлять её столько раз, сколько итераций у цикла. Но это чисто моё мнение, никому его не навязываю.

Kolyaj 28.01.2011 21:40

Цитата:

Сообщение от Vulkan
я считаю что лучше объявить переменную раз, а потом уже пользоваться в цикле, чем объявлять её столько раз, сколько итераций у цикла.

Переменная не объявляется столько раз, сколько итераций у цикла, она объявляется один раз при входе в функцию.

x-yuri 28.01.2011 22:37

Цитата:

Сообщение от Vulkan
Хорошо, аргументирую - я считаю что лучше объявить переменную раз, а потом уже пользоваться в цикле, чем объявлять её столько раз, сколько итераций у цикла. Но это чисто моё мнение, никому его не навязываю.

аргументов так и не услышал. Нету "потому что...". Практика объявления переменных в начале функции связана с ограничениями компиляторов того времени (например, C). Но даже новые стандарты того же C идут в направлении объявления переменных прямо перед использованием. Если трудно обнаружить объявления переменных, это всего лишь говорит о слишком больших функциях. Подробнее тут А помимо того, что непонятно зачем выносить объявления в начало, объявляя переменную прямо перед использованием мы огрничниваем "область видимости" переменной, т.е. сразу понятно, что раньше она не используется. А в языках с блочной областью видимости, мы, помимо всего прочего, ограничиваем использование переменной с другой стороны. Да и Robert C. Martin то же самое (G10: Vertical Separation) говорит

Zeroglif 31.01.2011 11:17

Дело вкуса. Последнее время выношу все переменные вверх, но могу и в цикле написать, зависит от того, с какой ноги утром встал. В любом случае J(ava)Script-у на мой выбор начхать... ;-)


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