语句总是会返回值的

块语句

  1. 对于空 {} 块语句返回(normal, empty)
  2. 对于{ statementList }
    • 对于statementList: statement情况执行statement并返回结果
    • 对于statementList: statementList statement,首先执行statementList并拿到结果v1,如果有提前return则返回v1;否则执行statement拿到结果v2,如果有异常返回{ throw, v };否则判断v2是否为empty;是则将v赋值为v1否则赋值为v2,返回{ normal, v2}

变量语句

  1. 对于声明变量语句var|let|const|class|import|export|function name = init返回{ normal, empty }
  2. 对于初始化语句 name=init返回{ normal, init }

空语句

  1. ;返回{ normal, empty }

表达式语句

  1. expression返回 { normal, getValue(expression) }

if语句

  1. if(expression) statement1 else statement2
    • 拿到expression的expRef,并通过ToBoolean(getValue(expRef))判断真假,真则返回statement1的返回值,否则返回statement2的返回值
  2. if(expression) statement 同上,不过判断为假时返回{ normal, empty }

循环语句

  • 各个循环返回值过程基本相同,就使用while(expression) { statement }举例
    1. let v = empty
    2. repeat
      1. let exprRef 为expression 执行后的结果
      2. if ToBoolean(getValue(exprRef)) 为 false, return { normal, v }
      3. let stmt = statement的执行结果
      4. 如果stmt != empty, 则v = stmt.value
      5. 如果stmt.type != continue || stmt.target 不是标签
        1. 如果stmt.type = break && stmt.target是标签则返回 { normal, v }
        2. 否则返回 stmt

break语句

  1. break; 返回{ normal, empty }
  2. break labelname; 返回{ normal, empty, labelname }

return语句

  1. return; 返回{ return, undefined }
  2. return expression; 返回{ return, getValue(exprRef(expression)) }

抛出语句

  1. throw expression; 返回{ throw, getValue(exprRef(expression)) }

try...catch...finally语句

  1. try block catch

    1. let B = Block的结果
    2. if B.type != throw则返回B
    3. 否则返回以B作为参数的catch的执行结果
  2. try block finally

    1. let B = Block结果
    2. let F = finally结果
    3. if F.type == normal返回B的结果
    4. 否则返回F
  3. try block catch finally

    1. let B = block的结果
    2. if B.type != throw,则let C = B
    3. 否则 let C = 以B作为参数的catch的执行结果
    4. let F = finally结果
    5. if F.type == normal返回C的结果
    6. 否则返回F
相关推荐
AiMan4 分钟前
千问生成的内容能否下载吗?
前端
北城笑笑5 分钟前
Vue 109 ,从零搭建 Vue3 + Electron 工程:生态、安全桥接与打包选型( Vue + Electron )
前端·javascript·vue.js·安全·electron·vue
JarvanMo19 分钟前
Flutter 3.50 & Dart 3.14发布,一起看看有哪些变化!
前端
莪_幻尘32 分钟前
4 个 3D 游戏,总体积 3.82MB:拆解 Claude 的 one-shot 工程链路
前端·ai编程·three.js
Highcharts.js41 分钟前
Highcharts智能数据分析平台Orbit 多语言配置技术文档
java·前端·javascript·highcharts·orbit·智能数据分析·设置文档
ABAP-張旺1 小时前
SAP ABAP 实战:SAP GUI上做 HTML 看板报表
前端·html·sap·abap
时间的情敌2 小时前
Cesium 建筑单体化、3DTiles 分类、楼层显隐、分户高亮(BIM + 倾斜孪生高频)
前端·3d·cesium
IT_陈寒2 小时前
JavaScript项目实战经验分享:从内存泄漏到性能优化的血泪史
前端·人工智能·后端
恋猫de小郭3 小时前
Flutter 3.50 & Dart 3.14 发布,快来看看有什么更新吧
android·前端·flutter
非优秀程序员11 小时前
第10章 千团出世|《互联网产品恩仇录》
前端