使用.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/