Есть ли причина использовать ключевое слово â € œvarâ в ES6?
Бабельный руководство по ES6 говорит:
let
- это новыйvar
.
По-видимому, единственное отличие состоит в том, что var
получает область видимости текущей функции , а let
получает область действия в текущий блок . Есть несколько хороших примеров в этом ответе .
Я не вижу причин использовать var
в коде ES6. Даже если вы хотите охватить заданную переменную всей функции, вы можете сделать это с помощью let
, поставив объявление в верхней части функционального блока, что и должно делать с помощью var
в любом случае, чтобы указать реальный объем. И если вы хотите сделать что-то более мелким в блоке для
или что-то еще, то вы тоже можете это сделать.
Таким образом, мой инстинкт заключается в том, чтобы полностью отказаться от использования var
при написании кода ES6.
Мой вопрос: я не прав? Есть ли законный случай, когда var
был бы предпочтительнее let
?
5 ответов
Дуг Крокфорд обсуждает let
на в этом вопросе в своем разговоре, " Лучшие части ".
Точка, let
позволяет избежать источника непонимания, особенно. для программистов с ожиданиями, установленными языками с блочной областью. var
имеет область функций (объявляет переменную, которая видима во всей функции), даже если она выглядит , как будто она имеет область блока .
var
, возможно, по-прежнему может быть полезен в крайнем случае, таком как машинный код, но я там сильно растягиваюсь.
(const
) также является новым и имеет область действия блока. После let x = {'hi': 'SE'}
вы можете переназначить x
, а после const y = x
вы не можете переназначить код y
. Это часто предпочтительнее, поскольку он заставляет что-то случайно случайно выходить из-под вас. Но, чтобы быть понятным, вы все еще может изменить объект y.hi = 'SO'
, если вы не заблокируете его.)
Реально, ваше впечатление верно для ES6: Adopt let
и const
. Прекратите использование var
.
(В еще одно исполнение «Лучших частей» , Дуг говорит, почему ===
, а не исправление проблемы ==
. ==
создает некоторые« неожиданные »результаты, поэтому просто используйте ===
.)
Пример раскрытия
Сеть разработчиков Mozilla дает пример, где var
не работает должным образом. Их пример является реалистичным, который устанавливает обработчики onclick
на веб-странице. Вот небольшой пример:
var a = [];
(функция () {
«использовать строгий»;
для (пусть i = 0; i <5; ++ i) {//*** `let` работает как ожидается ***
a.push (function () {return i;});
}
} ());
console.log (a.map (function (f) {return f ();}));
//печатает [0, 1, 2, 3, 4]
//Начнем заново, но изменим `let` на` var`.
//печатает [5, 5, 5, 5, 5]
var
нам не удается, потому что все итерации цикла имеют одну и ту же переменную i
, которая имеет значение 5
после завершения цикла.
Если вы пишете правильный код, вы, вероятно, сможете превратить все операторы var
в операторы let
без каких-либо семантических изменений.
let
является предпочтительным, поскольку он уменьшает область видимости идентификатора. Это позволяет нам безопасно объявлять переменные на месте первого использования.
const
предпочтительнее let
. Если вам не нужно мутировать ссылку, используйте объявление const
. Это имеет все преимущества let
, а также уменьшает присутствие унифицированных переменных и делает код более понятным. Если вы не уверены, что вам нужно будет изменить ссылку, объявите ее const
, пока вам не понадобится явно сделать это.
Я не обязательно думаю, что вы ошибаетесь, но есть предостережения в использовании var. По сути, let
должен помочь разработчикам обойти глупость JavaScript, особенно с конфликтами именования. var
, похоже, имеет большую область видимости, так как он хочет перейти к закрытию функции. Будут времена, когда вам нужно var, например, когда вам нужна переменная temp, доступная в пределах области внутри функции, в противном случае предпочтение let
over var поможет разработчикам с конфликтами именования. На более светлой ноте пришло время, когда ES6 представила let
.
Я склонен согласиться с тем, что в es6 следует использовать только «let». AFIK, redeclaring «let» генерирует ошибку (что хорошо), а при «var» вы просто переопределяете значение (хотя «строгий режим» в es5 тоже позаботится об этом).
let
означает «пусть переменная равно». Это объявление, другими словами, инициализация и назначение.
Он существует в отличие от const
, который, конечно, означает «константа» - это противоположность переменной.
Некоторые другие языки используют префикс для фактического объекта вместо объекта при его объявлении (например, def
является сокращением для «define function» - полностью отсутствует точка того, что «def» ".
Пусть
добавляет эту семантическую несогласованность в Javascript.
Логически, вы могли бы позволить константе равным что-то также, поскольку задание ключевого слова «let» предназначено для назначения памяти.
Проблема возникает из-за того, что ключевое слово var
было введено до поддержки const
, поэтому обратная совместимость не требует, чтобы var
не требовалось переменная. (Его также можно использовать для назначения постоянного значения.)
Следовательно, введение let
в неправильное положение. Чтобы убедиться, что мы это лексически помним, это неверно, они также решили изменить лексическую область let
vs var
, поэтому несогласованность в нашем сознании прежде всего при отладке .
Другими словами, let
существует, потому что люди (что означает поддерживающие язык) считают, что Javascript слишком последователен, освоив все его идиомы и особенности, желайте большего.
Боковое примечание, var
не работает в блоках «стрелка», если вы хотите рассматривать упомянутые блоки как закрытие (потому что var
был введен до обработки блоков как закрытий) но let
делает.