Javascript 添加新的第一个参数,然后应用原始参数

Javascript 添加新的第一个参数,然后应用原始参数,javascript,node.js,Javascript,Node.js,我使用map映射一组函数,如下所示: function runWaterfall(consumer, fns, cb) { fns = fns.map(function (fn) { return function () { fn(consumer, arguments); } }); async.waterfall(fns, cb); } 如您所见,我想将“consumer”作为每个函数fn的第一个参数,但

我使用map映射一组函数,如下所示:

function runWaterfall(consumer, fns, cb) {

    fns = fns.map(function (fn) {
        return function () {
            fn(consumer, arguments);
        }
    });

    async.waterfall(fns, cb);

}
如您所见,我想将“consumer”作为每个函数fn的第一个参数,但我认为我的语法不对

也许这样更好:

function runWaterfall(consumer, fns, cb) {

    fns = fns.map(function (fn) {
        return function () {
            fn.apply(null,[consumer, arguments]);
        }
    });

    async.waterfall(fns, cb);

}

我怀疑这两个都是正确的

好问题!您就快到了,只需要将类似数组的
参数
转换为数组,并使用
消费者

function runWaterfall(consumer, fns, cb) {

    fns = fns.map(function (fn) {
        return function () {
           var args = Array.prototype.slice.call(arguments, 0);           
           fn.apply(null, [consumer].concat(args));
        }
    });

    async.waterfall(fns, cb);

}
您不仅可以使用设置
上下文,还可以提供参数。您已接近
apply
,但它将立即调用该函数,而
bind
将返回一个参数已预填充的函数:

fns = fns.map(function (fn) {
    return fn.bind( null, consumer )
});

您有任何错误吗?或者输出是什么?不幸的是,这是一个更大的代码库的一部分,我还没有测试它:(
Apply
不会立即被调用,因为它在返回函数中。在您的示例中,您将
consumer
作为第一个参数应用,但丢失了最后一个参数。@RubenNagoga您是对的,
Apply
是从返回函数调用的。至于第二点:它可能是或可能不是期望的结果,很难用这么少的参数来判断问题中给出的上下文。