forEach
等 Javascript 数组方法有一个 thisArg
参数,用作调用回调的上下文:
array.forEach(callback[, thisArg])
every
、some
、filter
和 map
也是如此。但是,reduce
和 reduceRight
没有这样的参数。这样做有什么特别的原因,或者没有必要这样做吗?
例如,考虑以下使用 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/