块语句
一个 **块语句** 用于对零个或多个语句进行分组。块由一对花括号 ("花括号") 分隔,并包含零个或多个语句和声明的列表。
试一试
语法
js
{
StatementList
}
StatementList
-
块语句中分组的语句和声明。
描述
非严格模式下使用 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"
规范
规范 |
---|
ECMAScript 语言规范 # sec-block |
浏览器兼容性
BCD 表仅在浏览器中加载