javascript - 为什么 Array.prototype.reduce 没有 thisObject 参数?

标签 javascript ecmascript-5

forEach 等 Javascript 数组方法有一个 thisArg 参数,用作调用回调的上下文:

array.forEach(callback[, thisArg])

everysomefiltermap 也是如此。但是,reducereduceRight 没有这样的参数。这样做有什么特别的原因,或者没有必要这样做吗?

例如,考虑以下使用 reduceRight 实现的功能组合:

function compose () {
    var fns = [].slice.call(arguments,0);
    return function result() {
        return fns.reduceRight(
            function (prev,cur){
                return [cur.apply(this,prev)];
            },
            arguments
        )[0];
    };
}

我想让它成为“this-aware”,因此在调用 compose 返回的函数的上下文中调用正在组合的函数。目前它们似乎是在全局对象的上下文中调用的。我可以在函数 result 的顶部执行旧的 var self=this;,并将其用作 cur.apply 的第一个参数调用,我目前有 this,但如果 reduce 采用 thisArg 参数,那将是不必要的。

我是否遗漏了一些东西,reduce 是否有什么东西使它变得不必要或无用?

更新

@kangax 是的,我想到了这一点。我绝不会批评 API 的设计,但 reduce 的签名对我来说似乎有点奇怪。第二个可选参数的功能不同于普通的可选参数,后者通常只有一个默认值;相反,它的存在或不存在会改变行为,本质上是根据签名(参数计数)重载函数。当第二个参数不存在时,数组的第一个元素成为起始值,并且对回调的第一次调用是针对第二个值。在我看来,这种行为可以通过简单地调用

来轻松模拟
array.slice(1).reduce(fn,array[0])

而不是为省略第二个参数的情况建立特殊规则,反过来,如果你的假设是正确的,也使得基本上不可能弄清楚在哪里指定 thisArg 参数.再一次,我确信在制定规范时已经对这些问题进行了辩论,并且可能有充分的理由采用这种方法。

最佳答案

你总是可以使用这个方法:

array.reduce(callback.bind(context), initialValue);

...以便将特定上下文附加到回调函数。

关于javascript - 为什么 Array.prototype.reduce 没有 thisObject 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14867946/

相关文章:

javascript - 抽象关系比较算法: Why evaluation order is important?

javascript - 纯CSS关闭按钮

javascript - 如何避免嵌套切换?

javascript - 如何在 Angular 6 中循环链接 Promise

javascript - Twitter 按钮和 Google Page Speed

javascript - 从现有 JSON 数组的嵌套键/值创建一个新的 JSON 数组

javascript - 如何在不重叠的情况下用线连接圆圈

javascript - Object.constructor===Object.constructor.constructor//为什么?

javascript - 关于在 JavaScript 中定义全局变量

javascript - "locking down"JavaScript 对象有任何性能优势吗?