--- title: block slug: Web/JavaScript/Reference/Statements/block tags: - Dokumentacja_JavaScript - Dokumentacje - JavaScript - Wszystkie_kategorie translation_of: Web/JavaScript/Reference/Statements/block original_slug: Web/JavaScript/Referencje/Polecenia/block ---
Blok instrukcji jest stosowany do zgrupowania zero lub więcej instrukcji. Blok jest ograniczony parą nawiasów klamrowych i opcjonalnie może posiadać etykietę.
{ ListaInstrukcji }
EtykietaBloku: { ListaInstrukcji }
ListaInstrukcji
Blok instrukcji nazywany jest również w innych językach instrukcjami złożonymi. Pozwala użyć wielu instrukcji tam, gdzie JavaScript pozwala użyć tylko jednej. Składanie instrukcji w bloki jest powszechną praktyką w JavaScript. Za pomocą bloku można uzyskać też efekt przeciwny - brak instrukcji tam, gdzie jest wymagana.
var
Zmienne tworzone poprzez var
nie mają zasięgu bloku. Zmienne zadeklarowane w bloku są ograniczone do funkcji lub skryptu zawierającego, a efektyoperacji na nich utrzymują się poza samym blokiem. Innymi słowy, instrukcje blokowe nie wprowadzają zakresu. Chociaż "samodzielne" bloki są poprawną składnią, nie chcesz używać niezależnych bloków w JavaScript, ponieważ nie robią tego, co myślisz, że robią, jeśli myślisz, że robią coś takiego jak w C lub Java. Na przykład:
var x = 1;
{
var x = 2;
}
console.log(x); // zwraca 2
Otrzymujesz 2, ponieważ instrukcja var x = 2
, która jest w bloku jest w tym samym zasięgu co instrukcja przed blokiem. W C lub Javie podobny kod zwróciłby 1.
let
i const
Dla odmiany identyfikatory stworzone z użyciem let i const posiadają zakres blokowy:
let x = 1;
{
let x = 2;
}
console.log(x); // zwraca 1
Instrukcja x = 2
jest ograniczona w zakresie bloku, w którym została zdefiniowana.
To samo odnosi się do const
:
const c = 1;
{
const c = 2;
}
console.log(c); // zwraca 1 i nie rzuca wyjątkiem SyntaxError.
Zauważ, że const c = 2
nie rzuca wyjątku SyntaxError: Identifier 'c' has already been declared
, ponieważ może być zadeklarowane unikalnie w ramach bloku.
funkcji
Funkcja zadeklarowana w bloku również widzialna jest w zakresie tego bloku:
foo('outside'); // TypeError: foo is not a function
{
function foo(location) {
console.log('foo is called ' + location);
}
foo('inside'); // wykonuje się poprawnie i zwraca 'foo is called inside'
}
Bardziej precyzyjnie mówiąc blok instrukcji zapobiega Hoistingowi deklaracji funkcji na początek zakresu. Funkcja zachowuje się tak, jakby była zdefiniowana jako wyrażenie funkcji i jako taka jest tylko deklaracją zmiennej, która zostaje podniesiona do góry, na początek zakresu:
foo; // zwraca undefined
{
function foo(location) {
console.log('foo is called ' + location);
}
foo('inside'); // wykonuje się poprawnie i zwraca 'foo is called inside'
}
Konsekwentnie to znaczy, że gdy przeniesiemy wywołanie funkcji poniżej jej deklaracji - nie otrzymamy błędu:
{
function foo(location) {
console.log('foo is called ' + location);
}
foo('inside'); // works correctly and logs 'foo is called inside'
}
foo('outside'); // works correctly and logs 'foo is called outside'
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')}} | Initial definition. Implemented in JavaScript 1.0. |
Tabela zgodności na tej stronie jest generowana na podstawie danych strukturalnych. Jeśli chcesz przyczynić się do danych, sprawdź https://github.com/mdn/browser-compat-data i wyślij nam prośbę o wycofanie.
{{Compat("javascript.statements.block")}}