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