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

Javascript 使用.bind()避免.call()和.apply(),javascript,jquery,ecmascript-5,Javascript,Jquery,Ecmascript 5,我正在寻找一种方法来完成某项任务,也就是说,从 jQuery.when.apply( null, promiseArray ).done(...) 到 您可能知道,.bind()可以用来创建默认参数之类的东西,还可以做一些非常漂亮的事情。比如说,不要总是打电话 var toStr = Object.prototype.toString; // ... toStr.call([]) // [object Array] 我们可以这样做 var toStr = Function.prototype

我正在寻找一种方法来完成某项任务,也就是说,从

jQuery.when.apply( null, 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
,当调用
时,我无法真正实现这一点。如果您得到的promise对象数量未知,通常会将它们放入一个数组中,然后能够将它们传递到
。当
时,就像上面我的第一个代码片段一样

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

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"
我想我已经在这上面坐了太久了,不能再直接思考了。感觉好像有一个简单的解决办法我不想使用任何附加函数来解决此问题,我绝对希望使用
.bind()
来解决此问题

请参见此处的完整示例:

这应该可以:

when = Function.prototype.apply.bind( $.when, null);
您只需将
.bind
的第一个参数绑定(或者咖喱,如果愿意的话)并将其修复为
null

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

var when = Function.prototype.apply.bind( $.when );
这样做:

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

并且更新了JSFIDLE:

omg,我确信我在某个时候做到了这一点。我怎么会错过呢?至少我知道对于一个大问题来说,这是一个相当简单的解决方案。谢谢@Jon@詹迪:考虑到你的JS排骨比我的好多了,很明显你是因为疲劳错过了。干杯。@Raynos:耶,把盐揉进我受伤的自我..:P
var when = Function.prototype.apply.bind( $.when , null );