Javascript 您能在不立即调用函数的情况下将参数传递给函数吗?

Javascript 您能在不立即调用函数的情况下将参数传递给函数吗?,javascript,jquery,promise,Javascript,Jquery,Promise,我需要向pipe()handler函数提供一组函数名,这样它就可以按顺序执行它们,等待每个函数的完成。当这些函数不需要传递参数时,这是非常好的,但是当需要参数时,如果函数不继续并调用自身(由括号引起),我就无法知道如何传递它们 例如,这是我通常通过的: pipeHandler([function1,function2]) 在承诺完成之前,它将调用function1()和function2() 当我想做这样的事情时,困难就来了: pipeHandler([function1('value'),fu

我需要向
pipe()
handler函数提供一组函数名,这样它就可以按顺序执行它们,等待每个函数的完成。当这些函数不需要传递参数时,这是非常好的,但是当需要参数时,如果函数不继续并调用自身(由括号引起),我就无法知道如何传递它们

例如,这是我通常通过的:

pipeHandler([function1,function2])

在承诺完成之前,它将调用
function1()
function2()

当我想做这样的事情时,困难就来了:

pipeHandler([function1('value'),function2])

这会导致function1()立即调用,完全绕过承诺机制

如果有帮助,这是处理函数:

function pipeHandler(requiredFunctions) {
    //Execute first required function
    var executeFunctions = requiredFunctions[0]();

    //Execute each subsequent required function using pipe()
    for ( var index = 1; index < requiredFunctions.length; index++ ) {
        executeFunctions = executeFunctions.pipe(requiredFunctions[index]);
    }

    //Execute allDone() using pipe()
    executeFunctions = executeFunctions.pipe(allDone);
}
函数管道处理器(requiredFunctions){
//执行第一个必需的函数
var executeFunctions=requiredFunctions[0]();
//使用pipe()执行每个后续必需的函数
对于(var index=1;index
希望有人有主意

为什么不呢

pipeHandler([function() { function1('value'); }, function2]);
?


这就是匿名函数发挥作用的地方。如果您花一些时间使用Javascript,那么在某个时候使用setTimeOut时可能会遇到同样的问题

您可以使用匿名函数,该函数可以调用
函数1

pipeHandler([function () {;
    function1('value')
}, function2]);

这可以通过使用来简洁地完成。语法:


Bind返回一个分部函数应用程序,它是scope
scope
中的一个新函数,具有固定的第一个参数
'value'
。它可以处理任意数量的参数。

您可能正在寻找的是所谓的“部分应用程序”

根据需要支持的浏览器,您可以简单地使用
bind.


从阅读问题中我可以看出,没有异步性,只有一个规则的单线程函数调用序列,可以在每次调用时传递参数

如果是这样的话,那么你想使用。您的场景正是jQuery.callback的用途。文件说:

版本1.7中引入的jQuery.Callbacks()函数返回 多用途对象,提供了管理回调的强大方法 名单。它支持添加、删除、触发和禁用回调

阅读了jQuery.Callbacks的文档之后,可能还不清楚如何将参数传递给列表中的函数

最简单的选项是使用列表中的函数可以使用的对象触发列表:

function myFunction1(obj) {
    console.log(obj.myProperty1);
}

function myFunction2(obj) {
    console.log([obj.myProperty1, obj.myProperty2].join());
}
var callbacks = $.Callbacks();
callbacks.add(myFunction1);
callbacks.add(myFunction2);
callbacks.fire({
    myProperty1: 'X',
    myProperty2: 'Y'
});
更复杂的方法允许您:

  • 为添加到列表中的每个函数指定参数,以及
  • 为列表中的所有函数指定上下文的步骤
因此,您可以使用两种机制将数据传递给函数,并可以自由地在
.add()
语句或
.fire()
语句中指定数据,或同时在这两种语句中指定数据

为此,您需要以下实用程序功能:

function makeClosure(fn) {
    var args = Array.prototype.slice.call(arguments, 1);//seriously clever line - thank you John Resig
    return function (context) {
        fn.apply(context, args);
    }
}
可按如下方式使用:

function f1() {
    console.log(this.myProperty));
}

function f2(value1, value2) {
    console.log(value1 + ', ' + value2);
}

function f3(value1, value2) {
    //note the use of `this` as a reference to the context.
    console.log(value1 + ', ' + value2 + ', ' + this.myProperty);
}

var callbacks = $.Callbacks();
callbacks.add(makeClosure(f1, 'A1'));
callbacks.add(makeClosure(f2, 'B1', 'B2'));
callbacks.add(makeClosure(f3, 'C1', 'C2'));
callbacks.fire({
    myProperty: 'Z'
});

如果要在不调用函数的情况下传递参数,可以这样做:

function add (a, b) {
    return a + b;
}

// Outputs: 3
console.log(add(1, 2));

// Outputs: function
console.log(add.bind(this, 1, 2));
这将返回一个函数

function () { [native code] }
如果你想调用它

// this will return 3
console.log(add.bind(this, 1, 2)());
jQuery在这种情况下特别有用,因为它:

接受一个函数并返回一个始终具有特定上下文的新函数

因此,您不仅可以更改被调用函数的上下文(您可以提供一个对象而不是
this
),还可以传递函数接收到的参数值,而无需直接调用它

函数fun_w_param(v){console.info(“我是1,这是我的值:+v)}
函数fun_no_param(){console.info(“I'm#2”)}
函数pipeHandler(f1、f2){
f2();
控制台警告(“第二次延迟处理功能1”);
setTimeout(函数(){f1()},1000);
}
//在下面添加您的值作为代理的参数
管道装卸工(
$.proxy(fun\u w\u param,这个,“!!!proxy!!!”),
乐趣无穷
);

使用
箭头
方法,您可以简单地执行此操作

pipeHandler([() => function1('value'), function2]

如何使用params对象扩展函数定义,您可以在其中为函数定义可选参数,例如
{function1:[param1,param2]}
pipeHandler([() => function1('value'), function2]