语句和声明

JavaScript 应用程序由具有适当语法的语句组成。单个语句可以跨越多行。如果每个语句都用分号分隔,则多个语句可以出现在同一行上。这并不是一个关键字,而是一组关键字。

按类别划分的语句和声明

如需按字母顺序列出,请参见左侧边栏。

控制流

return

指定函数要返回的值。

break

终止当前循环、switch 或 label 语句,并将程序控制转移到终止语句之后的语句。

continue

终止当前循环或带标签循环的当前迭代中的语句执行,并继续执行循环的下一次迭代。

throw

抛出用户定义的异常。

if...else

如果指定条件为真,则执行一个语句。如果条件为假,则可以执行另一个语句。

switch

评估一个表达式,将表达式的值与一个 case 子句匹配,并执行与该 case 关联的语句。

try...catch

标记一个要尝试的语句块,并指定在抛出异常时如何响应。

声明变量

var

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

let

声明一个块作用域局部变量,可选择将其初始化为一个值。

const

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

using

声明同步处理的局部变量。

await using

声明异步处理的局部变量。

函数和类

function

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

function*

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

async function

声明一个具有指定参数的异步函数。

async function*

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

class

声明一个类。

迭代

do...while

创建一个循环,执行指定的语句,直到测试条件评估为假。条件在执行语句后评估,导致指定语句至少执行一次。

for

创建一个循环,该循环由三个可选表达式组成,用括号括起来并用分号分隔,后跟在循环中执行的语句。

for...in

以任意顺序迭代对象的枚举属性。对于每个不同的属性,可以执行语句。

for...of

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

for await...of

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

while

创建一个循环,只要测试条件评估为真,就执行指定的语句。条件在执行语句之前评估。

其他

空语句用于在 JavaScript 语法预期有语句时提供一个空语句。

块(Block)

块语句用于将零个或多个语句分组。块由一对花括号分隔。

表达式语句

表达式语句评估一个表达式并丢弃其结果。它允许表达式执行副作用,例如执行函数或更新变量。

debugger

调用任何可用的调试功能。如果没有可用的调试功能,此语句不产生任何效果。

export

用于导出函数,使其可供外部模块和其他脚本导入。

import

用于导入从外部模块、另一个脚本导出的函数。

label

为语句提供一个标识符,您可以使用 breakcontinue 语句引用该标识符。

with 已弃用

扩展语句的作用域链。

语句和声明之间的区别

在本节中,我们将混合两种构造:语句声明。它们是两个不相交的语法集合。以下是声明:

上面列表中的其他所有内容都是语句。

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

js
if (condition)
  statement1;
else
  statement2;

如果您使用声明而不是语句,则会引发 SyntaxError。例如,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;
}

浏览器兼容性

另见