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 Latest Draft (ECMA-262)
The definition of 'Block statement' in that specification.
Draft  
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

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidEdge MobileFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
blockChrome Full support YesEdge Full support YesFirefox Full support 1IE Full support YesOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes

Legend

Full support  
Full support

Zobacz także

Autorzy i etykiety dokumentu

Ostatnia aktualizacja: mdnwebdocs-bot,