Javascript Array 方法,例如forEach有一个thisArg参数,用作调用回调的上下文:
array.forEach(callback[, thisArg])
和every,some和一样。但是,并没有这样的参数。有什么特别的原因,还是没有必要的原因?filtermapreducereduceRight
例如,考虑以下使用 的功能组合实现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调用。目前,它们似乎是在全局对象的上下文中调用的。我可以var self=this;在 function 的顶部做 old result,并将其用作cur.apply调用的第一个参数,我目前有,但如果带一个参数this,那将是不必要的。reducethisArg
我是否在这里遗漏了一些东西,是否有一些东西reduce使这变得不必要或无用?
更新
@kangax 是的,这发生在我身上。我绝不会批评 API 的设计,但 for 的签名对reduce我来说似乎有点奇怪。第二个可选参数的功能与普通可选参数不同,后者通常只有一个默认值;相反,它的存在或不存在会改变行为,本质上是基于签名(参数计数)重载函数。当第二个参数不存在时,数组的第一个元素成为起始值,第一次调用回调是针对第二个值。在我看来,这种行为可以很容易地通过简单地调用来模拟
array.slice(1).reduce(fn,array[0])
而不是为省略第二个参数的情况建立特殊规则,如果你的假设是正确的,这反过来也使得基本上不可能弄清楚在哪里指定thisArg参数。再说一次,我确信在规范制定时已经对此类问题进行了辩论,并且可能有充分的理由采用这种方法。