Есть ли причина использовать ключевое слово â € œvarâ в ES6?

Бабельный руководство по ES6 говорит:

  

let - это новый var.

По-видимому, единственное отличие состоит в том, что var получает область видимости текущей функции , а let получает область действия в текущий блок . Есть несколько хороших примеров в этом ответе .

Я не вижу причин использовать var в коде ES6. Даже если вы хотите охватить заданную переменную всей функции, вы можете сделать это с помощью let, поставив объявление в верхней части функционального блока, что и должно делать с помощью var в любом случае, чтобы указать реальный объем. И если вы хотите сделать что-то более мелким в блоке для или что-то еще, то вы тоже можете это сделать.

Таким образом, мой инстинкт заключается в том, чтобы полностью отказаться от использования var при написании кода ES6.

Мой вопрос: я не прав? Есть ли законный случай, когда var был бы предпочтительнее let?

235 голосов | спросил callum 25 FebruaryEurope/MoscowbWed, 25 Feb 2015 01:08:48 +0300000000amWed, 25 Feb 2015 01:08:48 +030015 2015, 01:08:48

5 ответов


195

Дуг Крокфорд обсуждает 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 после завершения цикла.

ответил Jerry101 25 FebruaryEurope/MoscowbWed, 25 Feb 2015 01:58:45 +0300000000amWed, 25 Feb 2015 01:58:45 +030015 2015, 01:58:45
7

Если вы пишете правильный код, вы, вероятно, сможете превратить все операторы var в операторы let без каких-либо семантических изменений.

let является предпочтительным, поскольку он уменьшает область видимости идентификатора. Это позволяет нам безопасно объявлять переменные на месте первого использования.

const предпочтительнее let. Если вам не нужно мутировать ссылку, используйте объявление const. Это имеет все преимущества let, а также уменьшает присутствие унифицированных переменных и делает код более понятным. Если вы не уверены, что вам нужно будет изменить ссылку, объявите ее const, пока вам не понадобится явно сделать это.

ответил Aluan Haddad 26 J0000006Europe/Moscow 2016, 08:53:09
4

Я не обязательно думаю, что вы ошибаетесь, но есть предостережения в использовании var. По сути, let должен помочь разработчикам обойти глупость JavaScript, особенно с конфликтами именования. var, похоже, имеет большую область видимости, так как он хочет перейти к закрытию функции. Будут времена, когда вам нужно var, например, когда вам нужна переменная temp, доступная в пределах области внутри функции, в противном случае предпочтение let over var поможет разработчикам с конфликтами именования. На более светлой ноте пришло время, когда ES6 представила let.

ответил curiousdork 25 FebruaryEurope/MoscowbWed, 25 Feb 2015 01:40:17 +0300000000amWed, 25 Feb 2015 01:40:17 +030015 2015, 01:40:17
1

Я склонен согласиться с тем, что в es6 следует использовать только «let». AFIK, redeclaring «let» генерирует ошибку (что хорошо), а при «var» вы просто переопределяете значение (хотя «строгий режим» в es5 тоже позаботится об этом).

ответил yar1 10 Jpm1000000pmSun, 10 Jan 2016 22:26:23 +030016 2016, 22:26:23
-5

let означает «пусть переменная равно». Это объявление, другими словами, инициализация и назначение.

Он существует в отличие от const, который, конечно, означает «константа» - это противоположность переменной.

Некоторые другие языки используют префикс для фактического объекта вместо объекта при его объявлении (например, def является сокращением для «define function» - полностью отсутствует точка того, что «def» ".

Пусть добавляет эту семантическую несогласованность в Javascript.

Логически, вы могли бы позволить константе равным что-то также, поскольку задание ключевого слова «let» предназначено для назначения памяти.

Проблема возникает из-за того, что ключевое слово var было введено до поддержки const, поэтому обратная совместимость не требует, чтобы var не требовалось переменная. (Его также можно использовать для назначения постоянного значения.)

Следовательно, введение let в неправильное положение. Чтобы убедиться, что мы это лексически помним, это неверно, они также решили изменить лексическую область let vs var, поэтому несогласованность в нашем сознании прежде всего при отладке .

Другими словами, let существует, потому что люди (что означает поддерживающие язык) считают, что Javascript слишком последователен, освоив все его идиомы и особенности, желайте большего.

Боковое примечание, var не работает в блоках «стрелка», если вы хотите рассматривать упомянутые блоки как закрытие (потому что var был введен до обработки блоков как закрытий) но let делает.

ответил fijiaaron 8 FebruaryEurope/MoscowbMon, 08 Feb 2016 22:33:25 +0300000000pmMon, 08 Feb 2016 22:33:25 +030016 2016, 22:33:25

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132