Руководство Бабеля по ES6 гласит:
let
это новыйvar
.
Очевидно, единственное отличие состоит в том, что var
область видимости отображается в текущей функции , а let
область видимости - в текущий блок . В этом ответе есть несколько хороших примеров .
Я не вижу никакой причины для использования var
в коде ES6. Даже если вы хотите охватить данную переменную для всей функции, вы можете сделать это let
, поместив объявление в верхнюю часть функционального блока, что и должно быть в var
любом случае, чтобы указать фактическую область действия. И если вы хотите поместить что-то более точное в for
блок или что-то еще, то вы можете сделать это тоже.
Так что мой инстинкт - var
вообще прекратить использовать при написании кода ES6.
У меня вопрос, я не прав? Есть ли законный случай, когда var
предпочтительнее let
?
источник
var
в качестве сознательного индикатора того, что эта переменная предназначена для охвата всей функции, может быть полезным соглашением о «самодокументировании» ,let
оператор прямо в верхнюю часть функции, я думаю, также очевидно, что вы намеревались охватить его всей функцией. Я не думаю, что использованиеvar
делает это более понятным, чем просто найти его сверху.var
все еще существует, это обратная совместимость. Если бы не это, они бы вообще удалилиvar
или вообще не представилиlet
бы, вместо этого изменив семантикуvar
на то, что, вероятно, должно было быть все время.var
кажутся мне неясными , и их недостаточно для того, чтобы иметь в виду переменную третьего типа, которая прыгает вокруг. Вы можете охватитьlet
целую функцию a, просто поместив ее в верхнюю часть функции, что гораздо понятнее по замыслу, чем записьvar
в блоке (чтобы вывести ее из этого блока, чтобы затем использовать ее вне блока - странно) Он предупреждает, что если вы добавляете alet
к функции, то «это просто позиция, которая сигнализирует о разнице, а не о синтаксисе», но я думаю, что это хорошо.var
. примеры, которые он представляет для хранения,var
кажутся надуманными и основаны на серьезных ошибках кодирования. Гораздо лучше столкнуться с ошибкой и быть вынужденной исправлять такие ошибки, чем использовать языковые функции, которые позволяют сойти с рук! Что дальше, посоветуйте обернуть все в try / catch, чтобы предотвратить сбои? Остальная часть этой ссылки хороша, но я совсем не согласен с этой конкретной частью.Ответы:
Дуг Крокфорд обсуждает
let
на этом этапе своего выступления « Лучшие детали ».Дело в том, чтобы
let
избежать источника недопонимания, особенно для программистов с ожиданиями, установленными языками с block-scope. Avar
имеет область действия функции (она объявляет переменную, видимую во всей функции), хотя выглядит так, как будто она имеет область видимости блока .var
возможно, все еще может быть полезен в крайнем случае, например, сгенерированный компьютером код, но я сильно напрягаюсь.(
const
также является новым и имеет область видимости блока. Послеlet x = {'hi': 'SE'}
того, как вы можете переназначить наx
, а послеconst y = x
вы не можете переназначитьy
. Это часто предпочтительнее, так как предотвращает случайное изменение чего-либо из-под вас. Но, чтобы быть понятным, вы все равно можете изменить объект,y.hi = 'SO'
если только заморозить это.)Реально, ваше впечатление на ES6 правильно: принять
let
иconst
. Прекратите использоватьvar
.(В другом выступлении «The Better Parts» Даг говорит, что
===
было добавлено, а не исправлено проблем==
.==
Дает некоторые «удивительные» результаты, так что просто примите===
.)Показательный пример
Mozilla Developer Network приводит пример, где
var
работает не так, как задумано. Их пример является реалистичным, который устанавливаетonclick
обработчики на веб-странице. Вот небольшой тестовый пример:var
нам не удается, потому что все итерации цикла имеют одну и ту жеi
переменную области действия , которая имеет значение5
после завершения цикла.источник
==
не сломан вообще. Его можно просто определить какequality comparison using coersion
Проверить github.com/getify/You-Dont-Know-JS/blob/master/…[ '1.0' == 1.0, [1.0] == 1.0, [1.0] == '1.0', ['1.0'] == 1.0, [null] == '', [null] == 'null', '00' == false, [] == [], [] == 0, [] == '', [] == false, [] == true, [010] - [4] == ' 4.0 ', !![0], !![1], [0] == true, [1] == true, 1 == [[1]], 0 == [[0]], '1' == [1] ]
let
иvar
а междуlet
,var
иconst
var
работает как задумано, но не так, как многие ожидают. Это ошибка юзабилити, а не ошибка реализации.Если вы писали правильный код, вы, вероятно, сможете превратить все
var
операторы вlet
операторы без каких-либо семантических изменений.let
предпочтительнее, поскольку уменьшает область видимости идентификатора. Это позволяет нам безопасно объявлять переменные на сайте первого использования.const
предпочтительнееlet
. Если вам не нужно мутировать ссылку, используйтеconst
объявление. Это имеет все преимущества,let
наряду с уменьшением присутствия унифицированных переменных и упрощением анализа кода. Если вы не уверены, что вам нужно будет изменить ссылку, объявляйте ее,const
пока не обнаружите , что вам это явно необходимо.источник
Я не обязательно думаю, что вы ошибаетесь, но есть предостережения относительно использования var. По сути,
let
должно помочь разработчикам обойти глупость JavaScript, особенно с конфликтами имен.var
Кажется, он имеет большую область видимости, поскольку хочет перейти к области действия закрывающей функции. Будут времена, когда вам понадобится var, например, когда вам потребуется временная переменная, которая будет доступна в пределах блока внутри функции, в противном случае предпочтениеlet
над var поможет разработчикам в конфликтах имен. Проще говоря, пора ES6 представитьlet
.источник
var
в блоке доступна внутри всей функции, а не в пределах блока. Это вводящая в заблуждение особенность.Я склонен согласиться с тем, что в es6 следует использовать только «let». AFIK, переопределение «let» генерирует ошибку (что хорошо), в то время как с «var» вы просто переопределяете значение (хотя «строгий режим» в es5 тоже об этом позаботится).
источник
let
означает «пусть переменная равна». Это декларация, другими словами, инициализация и присваивание.Он существует в отличие от того,
const
что, конечно, означает «постоянный» - противоположность переменной.Некоторые другие языки используют префикс к реальному объекту вместо объекта при объявлении его (например,
def
сокращение для «определения функции» - полностью отсутствует точка «def»).Let
добавляет это семантическое несоответствие в Javascript.По логике вещей, вы могли бы позволить константе также кое-что равняться, так как задача ключевого слова let - выделять память.
Проблема возникает из-за того, что
var
ключевое слово было введено до того, как оноconst
было поддержано, поэтому обратная совместимость диктует, чтоvar
необязательно означает переменную. (Это также может быть использовано для назначения постоянного значения.)Следовательно, введение
let
в неправильном положении. Чтобы удостовериться, что мы помним, что это неправильно, лексически, они также решили изменить лексическую область действияlet
vsvar
, поэтому при отладке в первую очередь мы думаем о несоответствии.Другими словами,
let
существует потому , что люди (имеется в виду сопровождающие язык) думали, что Javascript был слишком последовательным, освоив все его идиомы и идиосинкразии, желая большего.Примечание:
var
не работает в блоках «стрелка», если вы хотите обрабатывать упомянутые блоки как замыкания (потому чтоvar
было введено до обработки блоков как замыкания), ноlet
работает.источник
let
потому что она не соответствует тону других ключевых слов в той же категории в JavaScript. Тем не менее, это не отвечает на вопрос, и не особенно хорошо поставлено. Проголосованоlet
это не просто разработчики, желающие больше сложности. Это на самом деле интуитивно понятнее, потому что когда вы зацикливаете и закрываете переменные, замыкание сохраняет последнее значение переменной var, но когда вы делаете то же самое над let, каждое замыкание в цикле имеет свое собственное значение для let, a ля примера от @ Jerry101 выше