【Babel】Babel的AST节点-语句、声明

180 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

语句(Statement)

语句是代码执行的最小单位,可以说,代码是由语句(Statement)构成的。语句是可以独立执行的单位。

语句名称代码节点
break语句breakBreakStatement
continue语句continueContinueStatement
return语句returnReturnStatement
debugger语句debuggerDebuggerStatement
throw语句throw Error()ThrowStatement
代码块{}BlockStatement
try/catch语句try{}catch(e){}TryStatement
for-in循环语句for(let key in obj){}ForInStatement
for循环语句for(let i=0;i<10;i++){}ForStatement
while循环语句while(true){}WhileStatement
do-while循环语句do{}while(true)DoWhileStatement
switch语句switch(v){case 1:break;default:;}SwitchStatement
label标签语句label:console.logLabeledStatement
with语句with(a){}WithStatement

label标签语句

label标签语句比较少见,记录一下它的用法。

JS中允许在语句的前面有标签(label),这个标签相当于定位符,用于跳转到程序的任意位置。 (如果有C/C++基础的应该会好理解,它就像C/C++中的goto语句。)

// label语句的格式 >>> label:statement
start:for(let i=0;i<10 ;i++){}

标签名可以是任意标识符(关键字以及保留字除外),语句部分可以是任意语句,因为标签名和变量名分属于不同的命名体系,因此标签名可以和变量名重复,同时,标签名和属性名的语法类似,因此标签名和属性名不能重复。

const labelA = '变量名和标签名可以重复' // 变量名为labelA
labelA:{ // 标签名为labelA
    labelA:'这种写法就是错误的,属性名和标签名不能重复' // 属性名为labelA
}

label标签语句常常和break语句以及continue语句搭配在循环中使用,更多使用在多重(嵌套)循环中。

for (let i = 0; i < 10; i++) {
  for (let j = 0; j < 10; j++) {
    if (i === 5 && j === 5) break
  }
}

像上面的代码,一个break语句只能跳出一个循环,但是我们有时候其实是想要在满足某些条件的时候,直接结束整个多重循环,这个时候label语句就派上用场了。

myLabel:for (let i = 0; i < 10; i++) {
  for (let j = 0; j < 10; j++) {
    if (i === 5 && j === 5) break myLabel
  }
}

像上面这样,给语句加上label,然后break就可以直接跳出整个循环了。continue语句的用法与break语句一样。continue命令后面有一个标签名,满足条件时,会跳过当前循环,直接进入下一轮外层循环。如果continue语句后面不使用标签,则只能进入下一轮的内层循环。

声明(Declaration)

声明语句是一种特殊的语句,它执行的逻辑是在作用域内声明一个变量、函数、class、import、export 等。 声明语句用于定义变量,也是代码中一个基础组成部分。

声明代码节点
变量const a = 1;VariableDeclaration
函数function say(){}FunctionDeclaration
class C{}ClassDeclaration
导入import d from 'd'ImportDeclaration
默认导出export default e = 1ExportDefaultDeclaration
按名称导出export {e};ExportNamedDeclaration
导出所有export * from 'e'ExportAllDeclaration