Всё просто :). Цель этого трюка — написать обёртку foo(), которая вызывает bar() в указанном контексте context и с переданными аргументами arg1, arg2 без лишних теложвижений.
В традиционном виде, это выглядело бы так
function bar(arg1, arg2) {}
function foo(context, arg1, arg2) {
bar.call(context, arg1, arg2);
}
Или так для произвольного числа аргументов:
function bar() {}
function foo() {
var context = arguments[0];
var args = Array.prototype.slice.call(arguments, 1); //делаем массив аргументов для bar
bar.apply(context, args);
}
Вместо этого салата использовать трюк с call.apply:
function foo() {
Function.call.apply(bar, arguments);
}
Работает это так: aplly вызывает Function.call на объекте bar c переданными в foo параметрами. То есть получаем следующее для самого первого примера с context и arg1, arg2:
bar.call(context, arg1, arg2)
Что нам и нужно.