Вот думаю что лучше использовать внутри функций, var
или let
?
Так как я использую компиляцию TypeScript то с поддержкой старых браузеров проблемы быть не должно в обоих вариантах.
Как я понял let
более предпочтительный, так как он полностью локален в блоках и более предсказуем.
Но меня смущает использование let в циклах, так как для каждой итерации создаётся своя переменная. Зачем это делается я знаю, но беспокоюсь за съедание лишней памяти. Или это такая мелочь для большинства задач, что на эту тему париться не стоит? Ответы прошу аргументированные.
PS: это не дубликат вопроса "Отличие let/const от var" потому что тот вопрос про конкретную ошибку в коде, а мой вопрос теоретический и более общий про использование данных конструкций. Кроме того я не спрашиваю про отличая, их я знаю, меня интересует что предпочтительнее использовать.
Напишу свой взгляд на let
и var
.
Конечно, let
- некий "новый синтаксический сахар". С ним могут возникать проблемы совместимости, но если это для вас не особо важно, то я бы использовал именно let
. Мои аргументы:
Приведенная выше конструкция мне кажется просто ужасной:
if (true) {
var a = 2;
}
a = a + 2;
В основном, с точки зрения читаемости. Человек, читающий ваш код, может часами искать объявление этой переменной. А раз эта конструкция ужасна, то единственное преимущество var
- фигня.
Что касается циклов. Конечно, создается новая переменная... Но тогда, когда эта переменная уже не нужна, любой нормальный GC ее соберет. С той же var
если вам нужно было сделать коллбэки в цикле, нужно было использовать дополнительную функцию, чтобы создать копию переменной. Что еще хуже.
Ну, пока что это все, что приходит на ум, но мне кажется, что этих причин достаточно. Единственное, на что вам нужно смотреть при выборе let
или var
- могут ли быть проблемы с совместимостью. Если нет - то смело используйте let
.
Отдаю предпочтение использованию var
, все же более привычно и не возникает проблем с совместимостью. По мне переменные let
представляют "синтаксический сахар", который минимизирует ошибки новичков при определении области видимости переменных (но это мое субъективное мнение, писать хороший код можно как используя var
, так и let
, а также их комбинации).
Но меня смущает использование let в циклах, так как для каждой итерации создаётся своя переменная. Зачем это делается я знаю, но беспокоюсь за съедание лишней памяти. Или это такая мелочь для большинства задач, что на эту тему париться не стоит?
Если у вас не огромные циклы с множественной вложенностью, то проблем быть не должно. Обычно в циклах перебора используются INT-переменные (4 байта). Далее сами можете посчитать сколько памяти съедает конкретный цикл. Если используются переменные других типов - смотрите сколько весят и подсчитываете по той же методике.
Как я понял let более предпочтительный, так как он полностью локален в блоках и более предсказуем.
Думаю, не всегда стоит считать это преимуществом. Приведу пример:
if (true) {
var a = 2;
}
a = a + 2;
Как мне кажется (сугубо личное мнение, но, думаю, многие со мной согласятся), это выглядит намного приятнее, чем это:
let a;
if (true) {
a = 2;
}
a = a + 2;
Так что лично я считаю, что ограничение области видимости переменной, объявленной при помощи let
в блок - это притянутое за уши преимущество. Не всегда это особенно удобно.
С другой стороны да, отсутствие hoisting'а вряд ли можно назвать недостатком [см. комментарии].
Но меня смущает использование let в циклах, так как для каждой итерации создаётся своя переменная. Зачем это делается я знаю, но беспокоюсь за съедание лишней памяти.
GC. Переменная сохраняется в памяти до тех пор, пока до нее можно добраться из глобального объекта. Так что на этот счет, думаю, волноваться точно не стоит.
В целом, на этот вопрос нельзя дать конкретный ответ. Для одних задач лучше подходит var
, для других - let
. Если особо не вдаваться в подробности, то я бы использовал let
с "вкраплениями" var
в ситуациях вроде той, что я описал выше.
Когда let используется внутри блока, то область видимости переменной ограничивается этим блоком. Напомним, что отличие заключается в том, что областью видимости переменных, объявленных оператором var, является вся функция, в которой они были объявлены.
var a = 5;
var b = 10;
if (a === 5) {
let a = 4; // The scope is inside the if-block
var b = 1; // The scope is inside the function
console.log(a); // 4
console.log(b); // 1
}
console.log(a); // 5
console.log(b); // 1
Вы можете использовать ключевое слово let для привязки переменных к локальной области видимости цикла for, вместо того что бы использовать глобальные переменные (объявленные с помощью var).
for (let i = 0; i<10; i++) {
console.log(i); // 0, 1, 2, 3, 4 ... 9
}
console.log(i); // i is not defined
P.S. for js FF.
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
На клиенте(android) получаю AuthCode и отправляю на сервер где нужно использовать календарь, получаю токен но когда запрашиваю event то возникает ошибка?
Если поступит пустой текст, точнее с пробелом " ", как поведет себя с ним функция trim()?
Как получить онлайн количество игроков на steam серверах, как работают мониторинг сайты?