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

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

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 .when调用时。 如果你有一个未知数量的promise对象,你通常将它们推入一个数组中,然后就可以将它们传递给.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" 

我想我现在坐在这已经太久了,不能再思考了。 感觉就像有一个简单的解决方案。 我不想使用任何其他function来解决这个问题,我绝对会使用.bind()来提供解决方案。

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

这应该工作:

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

你只需绑定(或curry,如果你愿意) .bind的第一个参数并将其修复为null

小提琴

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

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

做这个:

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

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