Почему разрешены автономные блоки кода?

#javascript

#javascript

Вопрос:

Недавно меня укусила ошибка. У меня был такой код:

 if (x == 1)
{
    do_stuff();
}
else
{
    do_other_stuff();
}
  

Однако я по ошибке опустил слово else , и поэтому второй блок кода всегда выполнялся.

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

Комментарии:

1. В настоящее время они удобны для определения области действия блоков (с let и const ), хотя я не уверен, что это соответствует первоначальному обоснованию, поскольку это относительно недавнее дополнение.

2. Вы можете сделать это почти на всех языках

3. Такое ощущение, что это, вероятно, следствие чрезвычайно короткого периода выхода концепции JavaScript на рынок. Вероятно, это работало нормально, пока не была добавлена какая-то другая функция, и у них не было времени проверить / исправить это, пока не стало слишком поздно.

Ответ №1:

Оператор block часто называют составным оператором на других языках. Это позволяет вам использовать несколько операторов, где JavaScript ожидает только один оператор. Объединение операторов в блоки является обычной практикой в JavaScript. Противоположное поведение возможно с использованием пустой инструкции, где вы не предоставляете инструкции, хотя она требуется.

Блок ограничен парой фигурных скобок и при необходимости может быть помечен (что означает, что его можно использовать с операторами break или continue)

Кроме того, это позволяет использовать переменные с областью действия блока с помощью let или const

 var x = 'Function scope'; {
  let x = 'Block Scope';
  console.log(x);
}

console.log(x);  

Ссылка:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/block

Комментарии:

1. Это действительно побочный эффект… let и const являются очень недавними языковыми дополнениями, тогда как {} блоки — нет

2. Я немного изменил ваш ответ, чтобы он отображался в виде цитаты. Конечно, это не проблема, но указание на то, что оно было взято непосредственно из цитаты, показалось уместным.

Ответ №2:

Подумайте об этом так… Дело не столько в том, что автономные блоки являются специальной конструкцией, разрешенной языком, а скорее в том, что такие блоки являются разновидностью инструкции. Цитирование MDN:

Оператор block (или составной оператор на других языках) используется для группировки нуля или более операторов.

Это означает, что конструкции типа if / else могут быть определены как

 if (<<expression>>) <<statement>> [ else <<statement>> ]
  

И тогда язык может рассматривать следующее как одно и то же, потому что оба foo() и { foo(); } являются операторами:

 if (true) foo();
if (true) { foo(); }
  

Вы сказали, что это «укусило» вас из-за опечатки. Хотя отдельные блоки являются основной особенностью языка, они могут быть признаком логической ошибки или запаха кода. Если вы хотите устранить подобные проблемы на ранней стадии, я бы рекомендовал установить eslint в вашем проекте. В частности, no-lone-blocks правило может выявить эту конкретную ошибку. При включенном этом правиле следующий код:

 if (x == 1)
{
    do_stuff();
}
{
    do_other_stuff();
}
  

Сгенерирует ошибку:

Блок избыточен. (без одиночных блоков)

Ответ №3:

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

Это позволяет break запускать внутри функции или за ее пределами без использования return инструкции.

 var a = 10;

block: {
    if (a === 10) break block;

    console.log('still in block');
}

console.log('outside block');  

Ответ №4:

if , else , for do и while ожидать одного оператора.

Блоки — это просто способ выполнить несколько инструкций — или ни одной — там, где ожидается одна.

Автономные блоки разрешены по той же причине, по которой разрешены автономные операторы. Этот код также потерпит неудачу, если вы забудете else , потому что do_other_stuff() всегда будет выполняться:

 if (x == 1)
    do_stuff();
else
    do_other_stuff();