我目前正在为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(number)。您会注意到,该步骤目前我有// ?,因为我不确定该怎么做。说ReturnIfAbrupt(...)是什么意思?

我已经阅读了草稿中有关ReturnIfAbrupt的部分,但是我无法理解第2步的操作,该如何替换上面代码中的// ?

从我的阅读来看,可能什么也不做,而ReturnIfAbrupt步骤仅意味着让ToNumber中发生的任何错误传播出去,从而退出该函数。但是,这似乎太冗长了,因为我认为不用说就可以了。另外,在我看来ToNumber甚至都不会抛出错误。有人可以确认或帮助我了解真实含义吗?

最佳答案

ReturnIfAbrupt指的是“异常完成”。完成记录包含类型和与其关联的值。正常完成将类似于表达式的结果值。函数的返回完成是除正常完成之外的通常预期完成。任何其他完成类型都是突然的。那就是抛出,破坏,继续。

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 - 在ES6草案中,ReturnIfAbrupt是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12995554/

10-11 13:35