1

使用 chrome 21 和原型 1.7.1,我发现 usingthrow $break不起作用。

Error它应该被停止时被抛出到浏览器

if (e != $break) { ... }

我怀疑这是因为inject在 Chrome 中有一个本机实现,并且它没有被与其他内置函数相同的功能包装。

假设这一点是正确的,还是我的代码有问题?

重新创建的代码:

var a = [1,2,3,4,5,6,7,9].inject([], function(arr, e) {
    console.log(e);
    if (e === 5) {
        throw $break;
    }

    arr.push('Done ' + e);
    return arr;
});
console.log('Final Array : ' + a)

更新

刚刚用 Firefox 14 和 IE 9 测试过,同样的错误出现了..

​<strong>更新(2015)

这似乎已通过1.7.3Chrome 45.0.2454.101 测试过

通过检查来源验证,reduce已删除

4

1 回答 1

4

问题是从 Prototype 1.7.1 开始,Array#inject有两个实现,它们的行为不同。(这不是很好tm。)这是 Prototype 1.7.1 和 1.7.0 之间的重大变化,正如我们可以看到使用this fiddlethis one

如果本机Array对象具有reduceES5 中的函数,Array#inject则使用它——无需处理$break ——而如果没有,Array#inject则通过Enumerable#inject, which uses Enumerable#each, which handles实现$break

如果您搜索 Prototype 1.7.1 源,您可以看到这一点。首先,您在 中找到非reduce版本Enumerable,然后reduce在内容中进一步找到版本,如果不存在Array,您会看到该Array版本抓取了该版本。Enumerablereduce

于 2012-09-25T13:02:13.117 回答