塊語句

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2015 年 7 月⁩以來,各瀏覽器均已提供此特性。

塊語句用於將零個或多個語句分組。塊由一對大括號(“花括號”)分隔,幷包含一個零個或多個語句和宣告的列表。

試一試

var x = 1;
let y = 1;

if (true) {
  var x = 2;
  let y = 2;
}

console.log(x);
// Expected output: 2

console.log(y);
// Expected output: 1

語法

js
{
  StatementList
}
語句列表

在塊語句中分組的語句和宣告。

描述

塊語句在其他語言中通常被稱為複合語句。它允許你在 JavaScript 期望只出現一個語句的地方使用多個語句。將語句組合成塊是 JavaScript 中的常見做法,尤其是在與if...elsefor等控制流語句結合使用時。相反的行為可以透過空語句實現,在這種情況下,你沒有提供任何語句,儘管需要一個。

此外,與letconstclass等塊級宣告結合使用時,塊可以防止臨時變數汙染全域性名稱空間,就像IIFE一樣。

在非嚴格模式下使用 var 或函式宣告的塊作用域規則

在非嚴格模式下使用 var 宣告的變數或由函式宣告建立的變數具有塊作用域。在塊中引入的變數作用域限定在包含函式或指令碼中,並且設定它們的效果會持續到塊之外。例如

js
var x = 1;
{
  var x = 2;
}
console.log(x); // 2

這會列印 2,因為塊中的 var x 語句與塊之前的 var x 語句在同一作用域中。

在非嚴格程式碼中,塊內的函式宣告行為異常。請勿使用它們。

在嚴格模式下使用 let、const、class 或函式宣告的塊作用域規則

相反,使用letconstclass宣告的識別符號確實具有塊作用域

js
let x = 1;
{
  let x = 2;
}
console.log(x); // 1

x = 2 的作用域僅限於定義它的塊。

const 也是如此

js
const c = 1;
{
  const c = 2;
}
console.log(c); // 1; does not throw SyntaxError

請注意,塊作用域的 const c = 2 不會丟擲 SyntaxError: Identifier 'c' has already been declared 錯誤,因為它可以在塊內唯一宣告。

嚴格模式下,塊內的函式宣告作用域限定在該塊中,並被提升到塊的頂部。

js
"use strict";

{
  foo(); // Logs "foo"
  function foo() {
    console.log("foo");
  }
}

foo(); // ReferenceError: foo is not defined

示例

將塊語句用作 for 迴圈的主體

for 迴圈接受單個語句作為其主體。

js
for (let i = 0; i < 10; i++) console.log(i);

如果你想在迴圈體中使用多個語句,可以將它們分組到一個塊語句中

js
for (let i = 0; i < 10; i++) {
  console.log(i);
  console.log(i ** 2);
}

使用塊語句封裝資料

letconst 宣告的作用域限定在包含塊中。這允許你將資料隱藏在全域性作用域之外,而無需將其包裝在函式中。

js
let sector;
{
  // These variables are scoped to this block and are not
  // accessible after the block
  const angle = Math.PI / 3;
  const radius = 10;
  sector = {
    radius,
    angle,
    area: (angle / 2) * radius ** 2,
    perimeter: 2 * radius + angle * radius,
  };
}
console.log(sector);
// {
//   radius: 10,
//   angle: 1.0471975511965976,
//   area: 52.35987755982988,
//   perimeter: 30.471975511965976
// }
console.log(typeof radius); // "undefined"

塊中的 using 宣告

你可以在塊中宣告帶usingawait using的變數,這會導致儲存在變數中的物件在控制退出塊時被處置。有關更多資訊,請參閱資源管理

js
{
  using reader1 = stream1.getReader();
  using reader2 = stream2.getReader();

  // do something with reader1 and reader2

  // Before we exit the block, reader1 and reader2 are automatically released
}

規範

規範
ECMAScript® 2026 語言規範
# sec-block

瀏覽器相容性

另見