13

我目前正在为 ES6 草案实现一些 shims。我想知道是否有人可以告诉我是什么ReturnIfAbrupt意思。例如,我的实现Number.toInt(调用 internal[[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甚至不会引发错误。有人可以确认或帮助我理解真正的含义吗?

4

1 回答 1

6

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

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

按照你的方式实现它,它需要将函数包装在 try catch 中。抛出的值将是突然完成。不过,这不是您在 JS 级别看到的东西,它用于在引擎级别实现控制流和非本地控制传输。

我已经在 J​​S 虚拟机中实现了大部分 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;
}
于 2012-10-21T10:08:52.047 回答