语句和声明

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;
}

浏览器兼容性

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
async function statement
async function* statement
block
break
class
const
continue
debugger
do...while
Empty statement (;)
export
Arbitrary module namespace identifier names
default keyword with export
export * as namespace
for
for await...of
for...in
for...of
async iterators
Closing iterators
function statement
Trailing comma in parameters
function* statement
IteratorResult object instead of throwing
Not constructable with new (ES2016)
Trailing comma in parameters
if...else
import
Arbitrary module namespace identifier names
Import attributes with assert syntax (formerly import assertions)
DeprecatedNon-standard
assert {type: 'css'}
DeprecatedNon-standard
assert {type: 'json'}
DeprecatedNon-standard
Import attributes (with syntax)
with {type: 'css'}
Experimental
with {type: 'json'}
Available in service workers
Available in workers
Available in worklets
label
let
return
switch
throw
try...catch
Optional catch binding
using keyword
ExperimentalNon-standard
var
while
with
Deprecated

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support
Partial support
Partial support
In development. Supported in a pre-release version.
In development. Supported in a pre-release version.
No support
No support
Experimental. Expect behavior to change in the future.
Non-standard. Check cross-browser support before using.
Deprecated. Not for use in new websites.
See implementation notes.
Has more compatibility info.

参见