即使抛出异常,左侧表达式也会递增

时间:2017-07-26 07:08:55

标签: javascript

给出以下代码片段:



const arr = [];
let pos = 0;

const fn = () => { throw 'foo'; };

try {
    arr[pos++] = fn();
} catch (e) {
    console.log(pos);
}




我很惊讶地发现pos的值是1.直观地说,我本来期望首先评估RHS,所以当抛出异常时pos将保持不变。

有人可以指出涵盖此内容的规范的相关部分吗?或以其他方式解释行为?

1 个答案:

答案 0 :(得分:2)

ECMAScript 2015 clearly defines this behavior:

  

AssignmentExpression [In,Yield] :LeftHandSideExpression [?Yield] = AssignmentExpression [?In,?Yield]

     
      
  1. 如果 LeftHandSideExpression 既不是 ObjectLiteral 也不是 ArrayLiteral ,那么

         

    一个。让 lref 成为评估 LeftHandSideExpression 的结果。

         

    湾ReturnIfAbrupt( LREF )。

         

    ℃。让 rref 成为评估 AssignmentExpression 的结果。

         

    [...]

  2.   

您可以看到首先评估左侧表达式,然后是右侧表达式( AssignmentExpression )。