Javascript数组方法,例如forEach
,具有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
参数。不过,我确信这样的问题在规范制定期间已经被讨论过了,并且可能有很好的理由采取这种方法。
reduce
函数的第二个参数是初始值。 - kangaxreduceRight
的原因是什么?我认为你可以通过对一个反转后的数组使用forEach
来轻松实现。编辑:我的意思是,你不是要减少函数数组,而是要将一组输入运行通过这些函数。 - tJener