block

概览

语句块 (或其他语言中的 复合语句) 用来组织零个或多条语句. 用一对花括号界定语句块.

语法

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

相关链接

文档标签和贡献者