#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();