语句是任何编程语言的基础结构。
比较常见的语句包括变量声明、表达式、条件、循环等,这些都是我们非常熟悉的东西。
JavaScript 语句的特别之处就是 JavaScript 语句执行机制涉及的一种基础类型:Completion 类型。
这一机制的基础正是 JavaScript 语句执行的完成状态,我们用一个标准类型来表示:Completion Record(用于描述异常、跳出等语句执行过程)。
Completion Record 表示一个语句执行完之后的结果,它有三个字段:
JavaScript 正是依靠语句的 Completion Record 类型,方才可以在语句的复杂嵌套结构中,实现各种控制。
在 JavaScript 中,我们把不带控制能力的语句称为普通语句。普通语句有下面几种。
这些语句在执行时,从前到后顺次执行(我们这里先忽略 var 和函数声明的预处理机制),没有任何分支或者重复执行逻辑。
普通语句执行后,会得到 [[type]] 为 normal 的 Completion Record,JavaScript 引擎遇到这样的 Completion Record,会继续执行下一条语句。
语句块就是拿大括号括起来的一组语句,它是一种语句的复合结构,可以嵌套。
在一个 block 中,如果每一个语句都是 normal 类型,那么它会顺次执行。
{
var i = 1; // normal, empty, empty
i ++; // normal, 1, empty
console.log(i) //normal, undefined, empty
} // normal, undefined, empty
在 block 中插入了一条 return 语句,产生了一个非 normal 记录,那么整个 block 会成为非 normal。这个结构就保证了非 normal 的完成类型可以穿透复杂的语句嵌套结构,产生控制效果。
{
var i = 1; // normal, empty, empty
return i; // return, 1, empty
i ++;
console.log(i)
} // return, 1, empty
控制类语句分成两部分,一类是对其内部造成影响,如 if、switch、while/for、try。
另一类是对外部造成影响如 break、continue、return、throw,这两类语句的配合,会产生控制代码执行顺序和执行逻辑的效果,这也是我们编程的主要工作。
实际上,任何 JavaScript 语句是可以加标签的,在语句前加冒号即可:
firstState: var i = 1;
大部分时候,这个东西类似于注释,没有任何用处。唯一有作用的时候是:与完成记录类型中的 target 相配合,用于跳出多层循环。
原文:https://www.cnblogs.com/zhaoyang007/p/12510751.html