使用.bind()避免使用.call()和.apply()

时间:2012-04-20 14:02:47

标签: javascript jquery ecmascript-5

我正在寻找一种方法来完成某项任务,即从

开始
jQuery.when.apply( null, promiseArray ).done(...)

when( promiseArray ).done(...)

正如您可能知道的那样,.bind()可以习惯于创建类似默认参数的东西,也可以做一些非常漂亮的东西。例如,而不是总是调用

var toStr = Object.prototype.toString;
// ...
toStr.call([]) // [object Array]

我们可以像

那样做
var toStr = Function.prototype.call.bind( Object.prototype.toString );
toStr([]) // [object Array]

这是相当酷的(即使有这样的性能问题调用.bind(),我知道并且我知道它),但我无法真正完成jQuerys {{1}打电话。如果你有一个未知数量的promise对象,你通常将它们推入一个数组,然后就可以将它们传递到.when,就像我上面的第一个代码片段一样。

到目前为止,我正在这样做:

.when

现在我们可以像

一样
var when = Function.prototype.apply.bind( $.when );

这很有效,但我也想摆脱每次都明确传递when( null, promiseArray ).done(...) 的需要。所以我试过

null

但这引起了我的注意:

var when = Function.prototype.apply.bind( $.when.call.bind( null ) );

我想我现在坐在这已经太久了,不能再思考了。感觉就像有一个简单的解决方案。 我不想使用任何其他功能来解决此问题,我绝对会优先使用"TypeError: Function.prototype.apply called on incompatible null" 解决方案。

请在此处查看完整示例:http://jsfiddle.net/pp26L/

2 个答案:

答案 0 :(得分:10)

这应该有效:

when = Function.prototype.apply.bind( $.when, null);

您只需绑定(或咖喱,如果您愿意).bind的第一个参数并将其修改为null

<强> Fiddle

答案 1 :(得分:7)

bind接受可变数量的参数,因此您可以部分应用方法。所以,而不是:

var when = Function.prototype.apply.bind( $.when );

这样做:

var when = Function.prototype.apply.bind( $.when , null );

更新了jsfiddle:http://jsfiddle.net/pp26L/2/