我目前正在为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
甚至可以抛出错误。有人可以确认或帮助我理解真正的含义吗?
答案 0 :(得分:6)
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;
}