apply = function(fn/*, ...args*/) {
    var args = slice(arguments, 1);
    return function(/*callArgs*/) {
        var callArgs = slice(arguments);
        return fn.apply(null, args.concat(callArgs));
    };
}
Creates a continuation function with some arguments already applied.

Useful as a shorthand when combined with other control flow functions. Any
arguments passed to the returned function are added to the arguments
originally passed to apply.

@name apply
@static
@memberOf module:Utils
@method
@category Util
@param {Function} fn - The function you want to eventually apply all
arguments to. Invokes with (arguments...).
@param {...*} arguments... - Any number of arguments to automatically apply
when the continuation is called.
@returns {Function} the partially-applied function
@example

// using apply
async.parallel([
    async.apply(fs.writeFile, 'testfile1', 'test1'),
    async.apply(fs.writeFile, 'testfile2', 'test2')
]);


// the same process without using apply
async.parallel([
    function(callback) {
        fs.writeFile('testfile1', 'test1', callback);
    },
    function(callback) {
        fs.writeFile('testfile2', 'test2', callback);
    }
]);

// It's possible to pass any number of additional arguments when calling the
// continuation:

node> var fn = async.apply(sys.puts, 'one');
node> fn('two', 'three');
one
two
three