--- title: Блок slug: Web/JavaScript/Reference/Statements/Блок tags: - JavaScript - Инструкция - Оператор - справочник translation_of: Web/JavaScript/Reference/Statements/block ---
Блок инструкций (или сложная инструкция в других языках) используется для группировки нуля или более инструкций. Блок отделяется парой фигурных скобок и может опционально быть {{jsxref("Statements/label", "поименован")}}:
[имя:] { инструкция_1; инструкция_2; ... инструкция_n; }
инструкция_1
, инструкция_2
, инструкция_n
Эта инструкция широко используется с операторами управления потоком (н., {{jsxref("Statements/if...else", "if...else")}}, {{jsxref("Statements/for", "for")}}, {{jsxref("Statements/while", "while")}}). Например:
while (x < 10) { x++; }
Обратите внимание, что блок инструкций не заканчивается точкой с запятой.
Блок инструкций часто называется сложной (составной) инструкцией в других языках. Он позволяет вам использовать несколько операторов там, где JavaScript ожидает один оператор. Помещение инструкций в блок - это распространенная практика в JavaScript. Противоположное поведение - использование пустого оператора там, где никаких действий не нужно, а оператор требуется.
var
Переменные, объявленные через var
, не имеют блочной области видимости. Переменные, введенные внутри блока, имеют областью видимости содержащую их функцию или скрипт, и последствия записи в них значения распространяются за границы, собственно, блока, в котором они объявлены. Другими словами, блок инструкций не вводит новую область видимости. Хотя "отдельностоящие" блоки не являются нарушением синтаксиса, не стоит использовать отдельностоящие блоки в JavaScript, потому что они не делают то, чего вы от них ожидаете, если вы ожидаете, что они будут себя вести аналогично блокам в C или Java. Например:
var x = 1; { var x = 2; } console.log(x); // выводит 2
Тут выводится 2, потому что оператор var x
внутри блока - в той же области видимости, что и оператор var x
перед блоком. В C или Java подобный код вывел бы 1.
let
и const
Наоборот, идентификаторы, объявленные с помощью {{jsxref("Statements/let", "let")}} и {{jsxref("Statements/const", "const")}} имеют блочную область видимости:
let x = 1; { let x = 2; } console.log(x); // выводит 1
x = 2
ограничено рамками области видимости блока, в котором оно было определено.
То же самое и для const
:
const c = 1; { const c = 2; } console.log(c); // выводит 1 и не выбрасывает SyntaxError...
Обратите внимание, что объявленная внутри блока const c = 2
не кидает SyntaxError: Identifier 'c' has already been declared
(идентификатор 'c' уже был объявлен
) потому что она может быть объявлена единожды внутри блока.
Specification | Status | Comment |
---|---|---|
{{SpecName('ESDraft', '#sec-block', 'Block statement')}} | {{Spec2('ESDraft')}} | |
{{SpecName('ES6', '#sec-block', 'Block statement')}} | {{Spec2('ES6')}} | |
{{SpecName('ES5.1', '#sec-12.1', 'Block statement')}} | {{Spec2('ES5.1')}} | |
{{SpecName('ES3', '#sec-12.1', 'Block statement')}} | {{Spec2('ES3')}} | |
{{SpecName('ES1', '#sec-12.1', 'Block statement')}} | {{Spec2('ES1')}} | Первоначальная редакция. Реализовано в JavaScript 1.0. |
{{CompatibilityTable}}
Возможность | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Базовая поддержка | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} |
Возможность | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Базовая поддержка | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} |