Спасибо, что поймали это!

леднее время после выхода ES6 многие источники предлагают мне использовать «const» и «let» вместо «var», и я должен прекратить использовать «var» в моем JavaScript. Что меня интересует, так это то, что если var не имеет преимущества перед "let" во всех точках зрения, то почему они просто не исправили var или даже не осудили var вместо того, чтобы позволить им идти бок о бок друг с другом?

 jhpratt24 нояб. 2017 г., 03:28
Есть еще использование дляvar.
 user889742124 нояб. 2017 г., 03:26
Потому что изменение или удаление приведёт к нарушению порядка миллиарда строк кода.
 user889742124 нояб. 2017 г., 03:30
@jhpratt: Как и что?
 Paulpro24 нояб. 2017 г., 03:27
var гораздо полезнее, чемlet когда вы хотите область действия функции, а не блокировать область.
 Shadow24 нояб. 2017 г., 03:35
@jhpratt, который не прошел бы проверку кода в любой хорошей компании ... и, конечно, на нем есть отпечаток любого линтера.

Ответы на вопрос(3)

Решение Вопроса

Вы правы, говоря, что нет реального преимущества использованияvar надlet (если вы определяете их в начале функции, их значение в основном идентично).

Вы правы, что нет реальной причины писать новый код, используяvar.

В Интернете есть страницы, которым уже десятки лет, и никто не собирается их переписывать. Нечего на самом деле получить, удаливvar с языка. Для интерпретируемых языков, таких как HTML и Javascript, обратная совместимость абсолютно обязательна.

Вот почему они решили не просто переопределятьvar, Возьмите следующий пример кода;

// THIS IS AN EXAMPLE OF BAD CODE. DO NOT COPY AND PASTE THIS.
if (logic) {
    var output = "true"
} else {
    var output = "false"
}
console.log(output)

Еслиvar был изменен, чтобы вести себя какlet тогдаconsole.log приведет к ошибке ссылки из-за разницы в объеме.

 Shadow24 нояб. 2017 г., 03:38
Опять же, обратная совместимость. Если бы люди использовалиvar ужасным образом, описанным в комментариях к вашему вопросу (и это действительно происходит), тогда этот код изменит смысл и сломается, вероятно, без предупреждения для разработчика, который его написал.
 Shadow24 нояб. 2017 г., 03:42
Я добавил пример.
 Leonard Li24 нояб. 2017 г., 03:37
Спасибо за ваш ответ. Я ценю это. Тем не менее, ваш ответ решает только одну часть вопроса: почему бы не осудить var? Как насчет рефакторинга «var» с самого начала и без введения «let»? Есть ли для этого веские причины?
 jfriend0024 нояб. 2017 г., 05:06
Я всегда считаю пример, который вы показываете, плохим. Лучше объявить переменную в более широкой области видимости. Это означает, что я не думаю, что это хороший пример хорошего использованияvar.
 Shadow24 нояб. 2017 г., 05:07
Я согласен - возможно, я должен сделать это более очевидным. Это, однако, пример того, почему просто меняетсяvar означатьlet это плохая идея, которая была намерением.

и пусть это зависит от их вариантов использования.

var

Объявления переменных обрабатываются перед выполнением кода. Область действия переменной JavaScript, объявленной с помощью var, является ее текущим контекстом выполнения. Область действия переменной JavaScript, объявленной вне функции, является глобальной.

let

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

const

Значения оператора const могут быть назначены один раз, и они не могут быть переназначены. Область действия оператора const работает аналогично операторам let.

Я надеюсь, вы понимаете.

 user889742124 нояб. 2017 г., 03:44
Вы не перечислили никаких преимуществ дляvar, Вы можете использоватьlet на функциональном или глобальном уровне тоже, так что где преимущество, кроме делать что-то неприятное, как объявлениеvar в блоке, но затем использовать его за пределами этого блока.
 Bergi24 нояб. 2017 г., 05:42
"Объявления переменных обрабатываются перед выполнением кода"-то же самое верно дляlet а такжеconst
 RobG26 мар. 2018 г., 06:23
Обратите внимание, что «объявления переменных» включаютпозволять а такжеConst (вECMA-262 §13.3.1) все они обрабатываются до выполнения кода (но присваивания выполняются при выполнении кода). ;-)

что иногда вам нужно переопределить переменную, чтобы написать меньше кода.

Один пример эта функция генерирует уникальный идентификатор:

function makeUniqueId(takenIds) {
  do {
    var id = Number.parseInt(Math.random() * 10);
  } while (takenIds.includes(id))
}

Который может быть вызван так

makeUniqueId([1,2,3,4,5,6,7])

Здесь я заявляюid переменная просто внутриdo блок и он "поднят" в область действия функции. Это вызвало бы ошибку, если бы я использовалlet, потому чтоwhile блок не будет видеть переменную изdo блок. Конечно, я мог бы снизитьlet доdo..while, но это создаст ту же переменную области действия функции с дополнительной строкой кода.

Другой пример это когда вы копируете код вставки в консоль devtools и каждый раз переменные объявляются заново.

Еще один пример, Что если вы хотите, чтобы ваши объявления переменных были близки к их использованию, но все равно рассматривали их как глобальные переменные функций? Если вы используетеlet таким образом, вы получите довольно запутанный опыт в инструментах разработки (все эти блоки, области видимости блоков).

Ноvar «хранит» их вместе в одном «локальном» списке:

 vloginov27 апр. 2018 г., 16:03
Спасибо, что поймали это!
 RobG26 мар. 2018 г., 06:18
"Как вы можете видеть, id, вероятно, будет повторно объявлен много раз ..."Нет, это не будет. Объявления обрабатываются ровно один раз, когда элемент управления входит в новый контекст выполнения (или блок для объявлений в пределах блока). ПеременнаяЯ бы существует с областью функции до любого из телаmakeUniqueId выполнен. Здесь нетпока блок, естьпока выражение и вы правы, сферапозволять декларация вделать пока цикл не распространяется напока состояние такЯ бы будет выходить за рамки, если объявлено с использованиемпозволять вделать блок.

Ваш ответ на вопрос