Избегайте .call() и .apply(), используя .bind()

Я ищу способ выполнить определенную задачу, а именно:

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. Если вы получили неизвестное количество объектов обещания, вы обычно вставляете их в массив, чтобы затем передать их в .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"

Думаю, я слишком долго сижу над этим и не могу думать прямо. Похоже, что есть простое решение. Я не хочу использовать какую-либо дополнительную функцию для решения этой проблемы, я бы предпочел решение с помощью .bind().

См. полный пример здесь: http://jsfiddle.net/pp26L/

Ответы

Ответ 1

Это должно работать:

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

Вы просто связываете (или карри, если хотите) первый аргумент .bind и исправляете его до null.

Fiddle.

Ответ 2

bind принимает переменное количество аргументов, поэтому вы можете частично применить метод. Итак, вместо:

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

Сделайте это:

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

И обновленный jsfiddle: http://jsfiddle.net/pp26L/2/