Spec-Zone.ru › JavaScript

Блок операторов

Базовый уровень Широко доступен

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 2015 года.

Блок операторов используется для группировки нуля или более операторов (инструкций). Блок ограничен парой фигурных скобок и содержит список из нуля или более операторов и объявлений.

Попробовать

var x = 1;
let y = 1;

if (true) {
  var x = 2;
  let y = 2;
}

console.log(x);
// Expected output: 2

console.log(y);
// Expected output: 1

Синтаксис

{
  StatementList
}
StatementList
Операторы и объявления, сгруппированные внутри блока операторов.

Описание

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

Кроме того, в сочетании с объявлениями с областью видимости блока, такими как let, const и class, блоки могут предотвратить засорение временными переменными глобального пространства имен, как это делают IIFEs.

Правила области видимости блока с var или объявлением функции в нестрогом режиме

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

var x = 1;
{
  var x = 2;
}
console.log(x); // 2

Здесь выводится 2, потому что оператор var x внутри блока находится в той же области видимости, что и оператор var x перед блоком.

В нестрогом коде объявления функций внутри блоков ведут себя странно. Не используйте их.

Правила области видимости блока с let, const, class или объявлением функции в строгом режиме

Напротив, идентификаторы, объявленные с помощью let, const и class, имеют область видимости блока:

let x = 1;
{
  let x = 2;
}
console.log(x); // 1

x = 2 ограничена областью видимости блока, в котором она была определена.

То же самое справедливо и для const:

const c = 1;
{
  const c = 2;
}
console.log(c); // 1; does not throw SyntaxError

Обратите внимание, что const c = 2 с областью видимости блока не вызывает SyntaxError: Identifier 'c' has already been declared, поскольку она может быть объявлена уникально внутри блока.

В строгом режиме объявления функций внутри блоков имеют область видимости этого блока и поднимаются (hoisted) в начало блока.

"use strict";

{
  foo(); // Logs "foo"
  function foo() {
    console.log("foo");
  }
}

foo(); // ReferenceError: foo is not defined

Примеры

Использование блока операторов в качестве тела цикла for

Цикл for принимает один оператор в качестве своего тела.

for (let i = 0; i < 10; i++) console.log(i);

Если вы хотите использовать более одного оператора в теле цикла, вы можете сгруппировать их в один блок операторов:

for (let i = 0; i < 10; i++) {
  console.log(i);
  console.log(i ** 2);
}

Использование блока операторов для инкапсуляции данных

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

let sector;
{
  // These variables are scoped to this block and are not
  // accessible after the block
  const angle = Math.PI / 3;
  const radius = 10;
  sector = {
    radius,
    angle,
    area: (angle / 2) * radius ** 2,
    perimeter: 2 * radius + angle * radius,
  };
}
console.log(sector);
// {
//   radius: 10,
//   angle: 1.0471975511965976,
//   area: 52.35987755982988,
//   perimeter: 30.471975511965976
// }
console.log(typeof radius); // "undefined"

using объявлений в блоке

Вы можете объявлять переменные с помощью using или await using в блоке, что приводит к утилизации объекта, хранящегося в переменной, при выходе управления из блока. Для получения дополнительной информации см. управление ресурсами.

{
  using reader1 = stream1.getReader();
  using reader2 = stream2.getReader();

  // do something with reader1 and reader2

  // Before we exit the block, reader1 and reader2 are automatically released
}

Спецификации

Спецификация
Спецификация языка ECMAScript® 2027
# sec-block

Совместимость с браузерами

Десктопные Мобильные Серверные
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
block
1
12
1
3
1
18
4
10.1
1
1.0
4.4
1
1.0.0
1.0
0.10.0

Смотрите также

  • while
  • if...else
  • let

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/block

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API