Когда следует использовать let и var?

EDIT: Пожалуйста, прочитайте вопрос! Я уже знаю разницу. Это не дубликат.

Очевидно, прямо сейчас я всегда должен использовать ключевое слово var, так как let поддерживается не во всем.

Когда ключевое слово let имеет лучшую поддержку (скажем, через пару лет я пишу приложение Node, использующее Harmony), когда мне следует использовать ключевое слово let, а когда ключевое слово var?

Я понимаю разницу — var для области видимости функции, а let для области видимости блока, но я ищу что-то вроде «всегда использовать ключевое слово let» или «использовать ключевое слово var в верхней части функций, но ключевое слово let в блоках». как для петель».


person callumacrae    schedule 20.02.2014    source источник
comment
Поскольку реализация все еще продолжается, мы действительно не знаем, как это будет в отношении производительности.   -  person Denys Séguret    schedule 20.02.2014
comment
comment
Ну, уже 2 человека спешат ответить, не удосужившись прочитать вопрос...   -  person Denys Séguret    schedule 20.02.2014
comment
И люди голосуют за то, чтобы его закрыли как дубликат. Раньше об этом не спрашивали - я искал некоторое время.   -  person callumacrae    schedule 20.02.2014
comment
@CallumMacrae Из другого вопроса: Когда следует использовать let вместо var?   -  person Denys Séguret    schedule 20.02.2014
comment
@dystroy Не видел этого. Однако единственные ответы отвечают на первую половину вопроса.   -  person callumacrae    schedule 20.02.2014
comment
Вы можете использовать let внутренние циклы для создания замыкания без необходимости написания дополнительного функционального слоя   -  person Paul S.    schedule 20.02.2014
comment
"use the var keyword at the top of functions, but the let keyword in blocks like for loops". Я предполагаю, что вы в значительной степени ответили сами себе здесь, нет? Честно говоря, я не могу придумать лучшего объяснения. Если у кого-то есть, отзовитесь.   -  person victorantunes    schedule 20.02.2014
comment
@victorantunes здесь подробно обсуждает var vs. let, и автор приходит к выводу, что var лучше по умолчанию, так что конкретные варианты использования let выделяются больше. davidwalsh.name/for-and-against-let   -  person Jon Coombs    schedule 05.05.2015
comment
@callumacrae, еще одна вещь, о которой следует помнить, - это закрытие. Цитируя статью выше, спецификация ES6 на самом деле говорит, что let i в заголовке цикла for ограничивает i не только циклом for, но и каждой итерацией цикла for. Здесь let может помочь устранить непредвиденные ошибки в циклах, но используйте var, когда вам нужно старое поведение.   -  person Jon Coombs    schedule 05.05.2015
comment
рассмотрите возможность повторного открытия этого вопроса, что позволит продолжить обсуждение этой темы. Каждый вариант использования между var и let приведет к различным преимуществам. Например: for, if, безусловно, дает больше преимуществ при использовании let, потому что область действия просто определена в блоке. И объявление по умолчанию по-прежнему будет идти на var   -  person Yeo    schedule 24.07.2015
comment
Это может быть лучшим объяснением слова «пусть». Также хорошие примеры: developer.mozilla.org/en/docs/ Интернет/JavaScript/Справочник/   -  person Teo    schedule 23.11.2016


Ответы (3)


Я бы сказал, что вы должны, как правило, использовать let всякий раз, когда это не неудобно. Такие как:

for (let i = 0; i < 100; i++) {
    // Do something
}

if (condition) {
    let msg = a + b + c;
    console.log(msg);
    alert(msg);
}

Преимущества такого подхода:

  1. Меньший риск переопределения использования некоторых глобальных переменных для чего-то другого
  2. Меньший риск утечек памяти из-за того, что переменные остаются в памяти долгое время после того, как они стали неактуальными.
person neelsg    schedule 20.02.2014
comment
Те, кто рассматривает возможность использования let в качестве выбора по умолчанию вместо var, могут сначала немного подумать об этом... здесь есть хорошая статья о плюсах и минусах: davidwalsh.name/for-and-against-let. Это не так просто, как использовать let всякий раз, когда это не неудобно. В конце концов, это все еще может быть выводом некоторых программистов, но было бы хорошо сначала понять плюсы и минусы... - person Matt Browne; 26.05.2015
comment
Привет @МэттБраун. Спасибо за ссылку, но я не думаю, что статья является очень хорошим примером. По сути, это говорит следующее: (1) если вы используете переменную до объявления с помощью let, ваш код ломается, (2) если вы используете переменную вне блока, в котором она была создана, ваш код ломается, (3) если вы находите и замените var на let в плохо написанном существующем коде, ваш код сломается, (4) есть отличное предложение для let, которое не вошло в окончательный стандарт, (5) если вы везде используете let, вы не общаетесь, если вы имели в виду область видимости блока или область видимости функции... Единственный момент, достойный рассмотрения, это (5) - person neelsg; 27.05.2015
comment
@neelsg И (5) в любом случае очень плохой случай. Если вам действительно нужно что-то видимое за пределами вложенной области (например, на уровне функции, а не в операторе if), вам следует объявить это вне вложенной области. Это гораздо более четко передает намерение и согласуется с подавляющим большинством других языков. - person Mud; 28.05.2015
comment
Я думаю, что то, что Дэвид Уолш пишет о let и var, звучит разумно и приводит множество примеров что вы должны делать, а что нет. Также рекомендуется его статья о принуждение, то есть неявное приведение типов в JavaScript. Если вы не в курсе, они могут привести ко многим ошибкам (когда вы используете == и когда ===?) ;-) ... - person Matt; 28.03.2018

Используйте let как правило, а var иногда.

Блочная область видимости является стандартным и наиболее удобочитаемым вариантом, который упростит отладку. Блочная область видимости позволяет легко увидеть, где именно переменная находится в области видимости. Область действия функции делает вещи намного менее очевидными, и гораздо легче случайно ввести ошибки с ошибками области видимости.

В общем, чем меньший объем вы можете использовать, тем лучше. Таким образом, let больше var.

В частности, это помогает решить бесконечную проблему закрытия переменных и неосознания того, что их значение изменится до того, как закрытие будет выполнено:

for (var i = 1; i <= 5; i++) {
  var item = document.createElement("LI");
  item.appendChild(document.createTextNode("Item " + i));

  let j = i;
  item.onclick = function (ev) {
    alert("Item " + j + " is clicked.");
  };
  list.appendChild(item);
}
person Phil H    schedule 20.02.2014
comment
Чтобы лучше понять, прочитайте ссылку jstips.co/en/javascript/ ключевое слово-var-vs-let - person M S Reddy; 23.09.2017

Что ж, ответ довольно прост: используйте var, если вам нужна область видимости функции, и let, если вам нужна область видимости блока.

person ooxi    schedule 20.02.2014
comment
ОП уже упоминал об этом. - person Java_User; 20.02.2014
comment
var по-прежнему хорошо работает для области видимости - person Chase; 18.04.2018