语句和声明

JavaScript 应用程序是由许多语法正确的语句组成的。单个语句可以跨多行。如果每个语句用分号隔开,那么多个语句可以在一行中出现。本页的内容并不是一个关键字,而是一组关键字。

语句和声明(按类别分类)

若需要按字母顺序排列的列表,请参阅左侧边栏。

控制流程

return

指定函数要返回的值。

break

终止当前的循环,switch 或标签语句,使程序跳到终止的语句之后的语句执行。

continue

终止当前或标签循环的当前迭代,直接执行下一个迭代循环。

throw

抛出一个用户定义的异常。

if...else

如果指定的条件为真,则执行相匹配的一个语句;若为假,则执行另一个语句。

switch

计算表达式,将子句与表达式的值做匹配,执行与该值相关联的语句。

try...catch

标记一个语句块,并指定语句抛出异常时的错误处理代码。

声明变量

var

声明一个变量,可同时将其初始化为一个值。

let

声明一个块级作用域的本地变量,可同时将其初始化为一个值。

const

声明一个只读的命名常量。

函数和类

function

声明一个指定参数的函数。

function*

生成器函数使编写迭代器更容易。

async function

使用指定的参数声明一个异步函数。

async function*

异步生成器函数使编写异步迭代器更容易。

class

声明一个类。

迭代

do...while

创建一个循环来执行指定语句,直到测试条件的求值为假。先执行语句,再对条件表达式求值,指定语句至少会执行一次。

for

创建一个由三个可选的表达式(用括号包裹,分号分割)组成的循环,并在循环体中执行语句。

for...in

无序遍历对象的可枚举属性。语句针对每个唯一的属性。

for...of

遍历可迭代对象(包括 数组、类数组对象、迭代器和生成器),对每个不同的属性的值,调用一个自定义的带有要执行的语句的迭代钩子。

for await...of

遍历异步可迭代对象、类数组对象、迭代器和生成器,对每个不同的属性的值,调用一个自定义的带有要执行的语句的迭代钩子。

while

创建一个执行指定语句的循环,直到测试条件的求值为假。先对条件进行求值,再执行语句。

其他

空语句

空语句,用于不在 JavaScript 语法期望有语句的地方提供语句。

块语句

块语句,用于将零个或多个语句组合在一起。块由一对花括号括起来。

表达式语句

表达式语句计算表达式的值并丢弃其结果。它允许表达式产生副作用,例如执行函数或更新变量。

debugger

调用可用的调试功能。如果没有调试功能可用,该语句不生效。

export

用来导出函数,以便这些函数能够被导入到外部模块或其他脚本中。

import

用来引入外部的模块或另一个脚本中导出的函数。

label

提供带标识的语句,与 breakcontinue 语句一起使用。

with 已弃用

拓展一个语句的作用域。

语句和声明的区别

在本节内容中,我们将混合两种结构:语句声明。它们是两套不相关的语法。以下是声明:

上面列出的除声明之外的其他内容都是语句。

术语“语句”和“声明”在 JavaScript 的正式语法中具有精确的含义,这会影响它们在代码中的位置。例如,在大多数控制流程结构中,其主体只接受语句——如 if...else 的两个分支:

js
if (condition)
  statement1;
else
  statement2;

如果使用声明而不是语句,则会产生语法错误。例如,let 声明不是语句,所以不能将其用作 if 语句的主体。

js
if (condition)
  let i = 0; // SyntaxError: Lexical declaration cannot appear in a single-statement context

另一方面,var 是一个语句,所以你可以将其单独用作 if 主体。

js
if (condition)
  var i = 0;

你可以将声明看作“绑定标识符到值”的过程,而语句则是“执行操作”的过程。var 语句的特殊性在于它不遵循正常的词法作用域规则,这可能会产生副作用——例如,创建全局变量、修改已存在的 var 定义的变量、定义可在其块之外可见的变量(这是因为 var 定义的变量并不是块作用域的)。

在另一个例子中,标签只能附加到语句上。

js
label: const a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context

备注: 有一种遗留语法允许函数声明具有标签,但它只是为了与 web 现实兼容而进行了标准化。

为了解决这个问题,你可以将声明括在大括号中——这使其成为块语句的一部分。

js
label: {
  const a = 1;
}

if (condition) {
  let i = 0;
}

浏览器兼容性

BCD tables only load in the browser

参见