概览
语句块 (或其他语言中的 复合语句) 用来组织零个或多条语句. 用一对花括号界定语句块.
语法
{ statement_1; statement_2; ... statement_n; }
statement_1
,statement_2
,statement_n
- 语句都包裹在语句块中.
说明
语句块通常在流程控制语句 (如 if
, for
, while
)中使用.如:
while (x < 10) { x++; }
注意 } 后面没有分号.
其他语言中通常将语句块称为 复合语句. 语句块允许你在Javascript需要一行语句的时候使用多行语句. 在JavaScript中使用语句块是种很常见的做法. 与之相反的做法是使用 empty语句, empty语句 可以在需要语句的环境下不提供任何语句.
块级作用域
使用 var
通过var声明的变量没有块级作用域. 在语句块(block)里声明的变量作用域是其所在的函数或者 script 标签内, 你可以在语句块外面访问到它. 换句话说, 语句块不会生成一个新的作用域. 尽管单独的语句块是合法的语句, 但在JavaScript中你不会想使用单独的语句块,因为它们不像你想象的C或Java中的语句块那样处理事物. 例如:
var x = 1; { var x = 2; } console.log(x); // 输出 2
该代码段会输出2,因为块中的 var x 语句与块前面的var x 语句作用域相同. 在 C 或 Java中, 这段代码会输出1.
使用 let 和 const
与 var 不同, 使用 let 和 const 声明的变量是有块级作用域的.
let x = 1;
{
let x = 2;
}
console.log(x); // 输出 1
x = 2 被限制在块级作用域中, 也就是它被声明时所在的块级作用于.
const 的结果也是一样的:
const c = 1;
{
const c = 2;
}
console.log(c); // 输出1, 而且不会报错
注意块级作用域里的常量声明 const c = 2 并不会报 SyntaxError: Identifier 'c' has already been declared 这样的语法错误, 因为这是一个新的作用域.
规范
Specification | Status | Comment |
---|---|---|
ECMAScript 1st Edition. | Standard | Initial definition. Implemented in JavaScript 1.0 |
ECMAScript 5.1 (ECMA-262) Block statement |
Standard | |
ECMAScript 2015 (6th Edition, ECMA-262) Block statement |
Standard |
浏览器兼容性
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |