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ę.

Składnia

Blok

{ ListaInstrukcji }

Blok z etykietą

EtykietaBloku: { ListaInstrukcji }

Parametry

ListaInstrukcji
Instrukcje zgrupowane w bloku.
EtykietaBloku
Opcjonalna etykieta dla wizualnej identyfikacji lub jako cel dla break.

Opis

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.

Reguły zasięgu bloku

Zasięg 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.

Zasięg 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.

Zasięg 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'

Specyfikacja

Specification Status Comment
ECMAScript (ECMA-262)
The definition of 'Block statement' in that specification.
Living Standard  
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Block statement' in that specification.
Standard  
ECMAScript 5.1 (ECMA-262)
The definition of 'Block statement' in that specification.
Standard  
ECMAScript 3rd Edition (ECMA-262)
The definition of 'Block statement' in that specification.
Standard  
ECMAScript 1st Edition (ECMA-262)
The definition of 'Block statement' in that specification.
Standard Initial definition. Implemented in JavaScript 1.0.

Kompatybilność z przeglądarkami

BCD tables only load in the browser

Zobacz także