为什么JavaScript枚举器方法通常接受上下文?

时间:2013-06-28 02:26:57

标签: javascript

大多数使用枚举器方法的库(我认为是本机JavaScript)允许为迭代器传递context

function reduce(iterator, memo, context){
    this.each(function(item, idx, list){
        memo = iterator.call(context, memo, item, idx, list)
    });
    return memo;
}

问题是为什么bind可以轻松提供相同的功能?

stooges.reduce(function(memo, stooge){
  ...
}, context) // as argument vs...

stooges.reduce(function(memo, stooge){
  ...
}.bind(context))

这是暂时存在的东西,因为bind并非在所有平台上都可用吗?或者仅仅是因为call的开销比bind更少?我总是读到函数越少越好。这是一个服用0 args的函数比服用1的函数优于服用2的函数

1 个答案:

答案 0 :(得分:2)

使用.bind创建并返回一个新函数。在某些情况下,您更喜欢限制javascript VM创建的对象/变量的数量,以便利用垃圾收集器清理周期。

此外,已知bind比“模拟”绑定解决方案慢得多(使用callapply):Why is Function.prototype.bind slow?

否则,将上下文作为参数传递通常更好,更具可读性。

ES6箭头功能可以保留词汇this,因此更容易:

// considering object context
var self = this;
stooges.reduce((memo, stooge) => (this === self));