#javascript
Вот думаю что лучше использовать внутри функций, var или let? Так как я использую компиляцию TypeScript то с поддержкой старых браузеров проблемы быть не должно в обоих вариантах. Как я понял let более предпочтительный, так как он полностью локален в блоках и более предсказуем. Но меня смущает использование let в циклах, так как для каждой итерации создаётся своя переменная. Зачем это делается я знаю, но беспокоюсь за съедание лишней памяти. Или это такая мелочь для большинства задач, что на эту тему париться не стоит? Ответы прошу аргументированные. PS: это не дубликат вопроса "Отличие let/const от var" потому что тот вопрос про конкретную ошибку в коде, а мой вопрос теоретический и более общий про использование данных конструкций. Кроме того я не спрашиваю про отличая, их я знаю, меня интересует что предпочтительнее использовать.
Ответы
Ответ 1
Напишу свой взгляд на let и var. Конечно, let - некий "новый синтаксический сахар". С ним могут возникать проблемы совместимости, но если это для вас не особо важно, то я бы использовал именно let. Мои аргументы: Приведенная выше конструкция мне кажется просто ужасной: if (true) { var a = 2; } a = a + 2; В основном, с точки зрения читаемости. Человек, читающий ваш код, может часами искать объявление этой переменной. А раз эта конструкция ужасна, то единственное преимущество var - фигня. Что касается циклов. Конечно, создается новая переменная... Но тогда, когда эта переменная уже не нужна, любой нормальный GC ее соберет. С той же var если вам нужно было сделать коллбэки в цикле, нужно было использовать дополнительную функцию, чтобы создать копию переменной. Что еще хуже. Ну, пока что это все, что приходит на ум, но мне кажется, что этих причин достаточно. Единственное, на что вам нужно смотреть при выборе let или var - могут ли быть проблемы с совместимостью. Если нет - то смело используйте let.Ответ 2
Отдаю предпочтение использованию var, все же более привычно и не возникает проблем с совместимостью. По мне переменные let представляют "синтаксический сахар", который минимизирует ошибки новичков при определении области видимости переменных (но это мое субъективное мнение, писать хороший код можно как используя var, так и let, а также их комбинации). Но меня смущает использование let в циклах, так как для каждой итерации создаётся своя переменная. Зачем это делается я знаю, но беспокоюсь за съедание лишней памяти. Или это такая мелочь для большинства задач, что на эту тему париться не стоит? Если у вас не огромные циклы с множественной вложенностью, то проблем быть не должно. Обычно в циклах перебора используются INT-переменные (4 байта). Далее сами можете посчитать сколько памяти съедает конкретный цикл. Если используются переменные других типов - смотрите сколько весят и подсчитываете по той же методике.Ответ 3
Как я понял 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 в ситуациях вроде той, что я описал выше.Ответ 4
let vs 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 в циклах Вы можете использовать ключевое слово 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.
Комментариев нет:
Отправить комментарий