语句和声明

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

¥JavaScript applications consist of statements with an appropriate syntax. A single statement may span multiple lines. Multiple statements may occur on a single line if each statement is separated by a semicolon. This isn't a keyword, but a group of keywords.

按类别分类的语句和声明

¥Statements and declarations by category

有关按字母顺序排列的列表,请参阅左侧的侧边栏。

¥For an alphabetical listing see the sidebar on the left.

控制流

¥Control flow

return

指定函数要返回的值。

break

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

continue

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

throw

抛出用户定义的异常。

if...else

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

switch

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

try...catch

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

声明变量

¥Declaring variables

var

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

let

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

const

声明一个只读命名常量。

函数和类

¥Functions and classes

function

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

function*

生成器函数可以更轻松地写入 iterators

async function

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

async function*

异步生成器函数可以更轻松地编写异步 iterators

class

声明一个类。

迭代

¥Iterations

do...while

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

for

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

for...in

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

for...of

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

for await...of

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

while

创建一个循环,只要测试条件计算结果为 true,该循环就会执行指定的语句。在执行语句之前评估条件。

其他的

¥Others

Empty

空语句用于不提供任何语句,尽管 JavaScript 语法期望提供一个语句。

Block

块语句用于对零个或多个语句进行分组。该块由一对大括号分隔。

Expression statement

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

debugger

调用任何可用的调试功能。如果没有可用的调试功能,则此语句无效。

export

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

import

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

label

提供带有标识符的语句,你可以使用 breakcontinue 语句引用该标识符。

with Deprecated

扩展语句的作用域链。

陈述和声明之间的区别

¥Difference between statements and declarations

在本节中,我们将混合两种结构:statementsdeclarations。它们是两组不相交的语法。以下是声明:

¥In this section, we will be mixing two kinds of constructs: statements and declarations. They are two disjoint sets of grammars. The following are declarations:

上面列出 中的其他内容都是声明。

¥Everything else in the list above is a statement.

术语 "statement" 和 "declaration" 在 JavaScript 的正式语法中具有精确的含义,会影响它们在代码中的放置位置。例如,在大多数控制流结构中,主体仅接受语句 - 例如 if...else 的两个手臂:

¥The terms "statement" and "declaration" have a precise meaning in the formal syntax of JavaScript that affects where they may be placed in code. For example, in most control-flow structures, the body only accepts statements — such as the two arms of an if...else:

js
if (condition)
  statement1;
else
  statement2;

如果你使用声明而不是语句,则它将是 SyntaxError。例如,let 声明不是语句,因此你不能将其以其裸露形式用作 if 语句的主体。

¥If you use a declaration instead of a statement, it would be a SyntaxError. For example, a let declaration is not a statement, so you can't use it in its bare form as the body of an if statement.

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

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

¥On the other hand, var is a statement, so you can use it on its own as the if body.

js
if (condition)
  var i = 0;

你可以看到声明为“binding 标识符到值”,语句为 "执行行动"。事实上 var 是一个语句而不是声明,这是一种特殊情况,因为它不遵循正常的词法作用域规则,并且可能会产生副作用 - 以创建全局变量、改变现有 var 定义的变量和定义变量的形式 在其块之外可见(因为 var 定义的变量不是块范围的)。

¥You can see declarations as "binding identifiers to values", and statements as "carrying out actions". The fact that var is a statement instead of a declaration is a special case, because it doesn't follow normal lexical scoping rules and may create side effects — in the form of creating global variables, mutating existing var-defined variables, and defining variables that are visible outside of its block (because var-defined variables aren't block-scoped).

再例如,labels 只能附加到语句上。

¥As another example, labels can only be attached to statements.

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

注意:有一个允许 函数声明要有标签 的遗留语法,但它只是为了与网络现实兼容而标准化。

¥Note: there's a legacy grammar that allows function declarations to have labels, but it's only standardized for compatibility with web reality.

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

¥To get around this, you can wrap the declaration in braces — this makes it part of a block statement.

js
label: {
  const a = 1;
}

if (condition) {
  let i = 0;
}

浏览器兼容性

BCD tables only load in the browser

¥Browser compatibility

也可以看看