Блок операторов
Базовый уровень Широко доступен
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 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 |
Смотрите также
© 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