js执行(4)

  1. completion类型
    造成以下这种差异是因为 js中的Completion Record

     function foo(){
       try{
         return 0;
       } catch(err) {
    
       } finally {
         console.log("a")
       }
     }
    
     console.log(foo());
    
    
     function foo(){
       try{
         return 0;
       } catch(err) {
    
       } finally {
         return 1;
       }
     }
    
     console.log(foo());
    
  2. Completion Record ( 利用这些语句类型 就可以在复杂的嵌套结构中进行控制 )

    Completion Record表示一个语句执行完之后的结果,有三个字段:

     [[type]] 表示完成的类型,有 break continue return throw 和 normal 几种类型;
     [[value]] 表示语句的返回值,如果语句没有,则是 empty;
     [[target]] 表示语句的目标,通常是一个 JavaScript 标签(标签在后文会有介绍)。
    

    a. 普通语句 (
    执行后会得到[[type]]为normal的 Completion Record
    只有表达式语句才会产生[[value]]
    )
    声明类语句
    var声明
    const声明
    let声明
    函数声明
    类声明
    表达式语句
    空语句
    with语句
    debugger语句

    b. 语句块
    return 语句可能产生 return 或者 throw 类型

     {
       var i = 1; // normal, empty, empty
       i ++; // normal, 1, empty
       console.log(i) //normal, undefined, empty
     } // normal, undefined, empty
    
    
    
     如果语句块内部的 Completion Record的[[type]]不为 normal 则会打断语句块后续的语句执行
    
     {
       var i = 1; // normal, empty, empty
       return i; // return, 1, empty
       i ++;
       console.log(i)
     } // return, 1, empty
    

    c. 控制型语句
    穿透: 不在当前这一层处理 向外逐层寻找可以"消费"的那一层 直到最后没找到就报错

                 break     continue      return      throw
      if         穿透        穿透          穿透        穿透
      switch     消费        穿透          穿透        穿透
      for/while  消费        消费          穿透        穿透
      function   报错        报错          消费        穿透
      try        特殊处理    特殊处理      特殊处理      消费
      catch      特殊处理    特殊处理      特殊处理      穿透
      finally    特殊处理    特殊处理      特殊处理      穿透
    
             function test() {
               var a = 0;
               switch (a) {
                 case 0:
                   if (true) {
                     console.log("111");
                     break;
                   }
               }
    
               if (true) {
                 console.log("222");
               }
             }
    
             test();
             // 111
             // 222
    
             * 代码执行到 break | if 遇到 break break穿透到上一层
               switch 遇到 break break被消费了
    
    
      if
      switch
      for
         for
         for...of
         for-await-of
         for...in
    
      while
         while
         do-while
    
      continue
      break
      return
      throw
      try
    

    d. 带标签的语句

  3. JavaScript 语句可以加标签
    test_var: var i = 1;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值