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