塊語句
塊語句用於將零個或多個語句分組。塊由一對大括號(“花括號”)分隔,幷包含一個零個或多個語句和宣告的列表。
試一試
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...else和for等控制流語句結合使用時。相反的行為可以透過空語句實現,在這種情況下,你沒有提供任何語句,儘管需要一個。
在非嚴格模式下使用 var 或函式宣告的塊作用域規則
在非嚴格模式下使用 var 宣告的變數或由函式宣告建立的變數不具有塊作用域。在塊中引入的變數作用域限定在包含函式或指令碼中,並且設定它們的效果會持續到塊之外。例如
js
var x = 1;
{
var x = 2;
}
console.log(x); // 2
這會列印 2,因為塊中的 var x 語句與塊之前的 var x 語句在同一作用域中。
在非嚴格程式碼中,塊內的函式宣告行為異常。請勿使用它們。
在嚴格模式下使用 let、const、class 或函式宣告的塊作用域規則
相反,使用let、const和class宣告的識別符號確實具有塊作用域
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);
}
使用塊語句封裝資料
let 和 const 宣告的作用域限定在包含塊中。這允許你將資料隱藏在全域性作用域之外,而無需將其包裝在函式中。
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 宣告
你可以在塊中宣告帶using或await 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 |
瀏覽器相容性
載入中…