语句和声明
JavaScript 应用程序是由许多语法正确的语句组成的。单个语句可以跨多行。如果每个语句用分号隔开,那么多个语句可以在一行中出现。本页的内容并不是一个关键字,而是一组关键字。
语句和声明(按类别分类)
若需要按字母顺序排列的列表,请参阅左侧边栏。
控制流程
声明变量
函数和类
function
-
声明一个指定参数的函数。
function*
-
生成器函数使编写迭代器更容易。
async function
-
使用指定的参数声明一个异步函数。
async function*
-
异步生成器函数使编写异步迭代器更容易。
class
-
声明一个类。
迭代
do...while
-
创建一个循环来执行指定语句,直到测试条件的求值为假。先执行语句,再对条件表达式求值,指定语句至少会执行一次。
for
-
创建一个由三个可选的表达式(用括号包裹,分号分割)组成的循环,并在循环体中执行语句。
for...in
-
无序遍历对象的可枚举属性。语句针对每个唯一的属性。
for...of
-
遍历可迭代对象(包括
数组
、类数组对象、迭代器和生成器),对每个不同的属性的值,调用一个自定义的带有要执行的语句的迭代钩子。 for await...of
-
遍历异步可迭代对象、类数组对象、迭代器和生成器,对每个不同的属性的值,调用一个自定义的带有要执行的语句的迭代钩子。
while
-
创建一个执行指定语句的循环,直到测试条件的求值为假。先对条件进行求值,再执行语句。
其他
语句和声明的区别
在本节内容中,我们将混合两种结构:语句和声明。它们是两套不相关的语法。以下是声明:
let
const
function
function*
async function
async function*
class
export
(备注:它只能出现在模块的顶层)import
(备注:它只能出现在模块的顶层)
上面列出的除声明之外的其他内容都是语句。
术语“语句”和“声明”在 JavaScript 的正式语法中具有精确的含义,这会影响它们在代码中的位置。例如,在大多数控制流程结构中,其主体只接受语句——如 if...else
的两个分支:
if (condition)
statement1;
else
statement2;
如果使用声明而不是语句,则会产生语法错误。例如,let
声明不是语句,所以不能将其用作 if
语句的主体。
if (condition)
let i = 0; // SyntaxError: Lexical declaration cannot appear in a single-statement context
另一方面,var
是一个语句,所以你可以将其单独用作 if
主体。
if (condition)
var i = 0;
你可以将声明看作“绑定标识符到值”的过程,而语句则是“执行操作”的过程。var
语句的特殊性在于它不遵循正常的词法作用域规则,这可能会产生副作用——例如,创建全局变量、修改已存在的 var
定义的变量、定义可在其块之外可见的变量(这是因为 var
定义的变量并不是块作用域的)。
在另一个例子中,标签只能附加到语句上。
label: const a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
备注: 有一种遗留语法允许函数声明具有标签,但它只是为了与 web 现实兼容而进行了标准化。
为了解决这个问题,你可以将声明括在大括号中——这使其成为块语句的一部分。
label: {
const a = 1;
}
if (condition) {
let i = 0;
}
浏览器兼容性
BCD tables only load in the browser