编程语言
首页 > 编程语言> > javascript – ReturnIfAbrupt在ES6草案中意味着什么?

javascript – ReturnIfAbrupt在ES6草案中意味着什么?

作者:互联网

我目前正在为ES6草案实施一些垫片.我想知道是否有人能告诉我ReturnIfAbrupt是什么意思.例如,我对Number.toInt(调用内部[[ToInteger]]的实现如下:

if (!('toInt' in Number))
    Object.defineProperty(Number, 'toInt', {

        value: function toInt(value) {
            // ECMA-262 Ed. 6, 9-27-12. 9.1.4

            // 1. Let number be the result of calling ToNumber on the input argument.
            var number = Number(value);

            // 2. ReturnIfAbrupt(number).
            // ?

            // 3. If number is NaN, return +0.
            if (number != number) return 0;

            // 4. If number is +0, -0, +Infinity, or -Infinity, return number.
            if (number == 0 || 1 / number == 0) return number;

            // 5. Return the result of computing sign(number) * floor(abs(number)).
            return (n < 0 ? -1 : 1) * Math.floor(Math.abs(number));

        },

        writable: true,
        configurable: true

    });

第2步是ReturnIfAbrupt(数字).你会注意到我目前有//?因为我不知道该怎么办.当它说ReturnIfAbrupt(…)时它意味着什么?

我已经阅读了草案中关于ReturnIfAbrupt的部分,但是我无法理解为第2步做什么,取代什么//?在上面的代码中.

从我的阅读中,可能没有什么可以做,而ReturnIfAbrupt步骤仅仅意味着让ToNumber中发生的任何错误传播,退出该函数.然而,这似乎过于冗长,我认为这可不言而喻.而且,在我看来,ToNumber甚至不会抛出错误.有人可以确认或帮助我理解真正的含义吗?

解决方法:

ReturnIfAbrupt指的是Abrupt完成.完成记录包含类型和与之关联的值.正常完成将类似于表达式的结果值.除正常完成外,函数的返回完成是通常的预期完成.任何其他完成类型都是突然的.那是投掷,休息,继续.

if (isCompletionRecord(v)) {
  if (isAbruptCompletion(v)) {
    return v;
  } else {
    v = v.value;
  }
}

按原样实现它,它需要将函数包装在try catch中.抛出的值将是一个突然完成.这不是你在JS级别看到的,它是用于在引擎级实现控制流和非本地控制传输.

我已经在JS虚拟机中实现了大部分ES6规范,这也可能有助于揭示它,这里是ToInteger:https://github.com/Benvie/continuum/blob/master/lib/continuum.js#L516

function ToInteger(argument){
  if (argument && typeof argument === OBJECT && argument.IsCompletion) {
    if (argument.IsAbruptCompletion) {
      return argument;
    }
    argument = argument.value;
  }
  return ToNumber(argument) | 0;
}

标签:javascript,ecmascript-harmony
来源: https://codeday.me/bug/20191005/1857162.html