如何在Javascript中传递要作为回调处理的字符串或函数名列表

时间:2012-02-13 11:20:00

标签: javascript jquery callback

做了一点谷歌搜索,但还没找到我想要的东西。

为了减少应用程序所需的JAvascript行数,我试图尽可能多地使用可重用的函数。

问题当然是尽量使这些功能变得灵活。

所以我有一个使用jQuery通过克隆函数动态扩展的表单。为了实现这一点,还需要运行一些其他功能,例如,在动态创建的元素上正确初始化datepickers。

这些要求因克隆的形式而异。

所以,我按如下方式调用我的克隆函数:

$('.button').click(function (){
    var thisID = $(this).attr('id').replace('add', '');
    cloneDetails(thisID, initialiseDates);
});

cloneDetails函数如下所示:

function cloneDetails(cur_num, callBackFunctions) {

  /// do loads of stuff ///

 callBackFunctions();

});

在这种情况下,克隆功能将运行并执行它所需的功能,然后它将运行第二个函数调用initialiseDates

我希望能够做的是指定在克隆功能之后运行的几个函数名称,并调用诸如

cloneDetails(thisID, 'initialiseDates, doSomethingElse, doAnotherThing');

因此,在运行cloneDetails函数之后,说明要运行的函数列表。

我认为我没有正确设置callBack方法,也不知道应该怎么做。

非常感谢。

编辑:我不想将所有这些函数捆绑到一个函数中,重点是这些函数应该可以独立使用和/或一起使用。

2 个答案:

答案 0 :(得分:1)

我可以想到几种方法:

  1. 您可以拆分字符串,并在列表中的每个名称中使用eval(name+'()')。请注意,eval()可能是邪恶的,安全明智的。

  2. 为什么不将函数作为数组传递而不是字符串?简单地迭代arguments[1..n]arguments是一个包含所有函数参数的自动变量。)

  3. 使用匿名函数:

    cloneDetails(thisID, function(){
        initialiseDates();
        doSomethingElse();
        doAnotherThing();
    });
    
  4. 我喜欢上一种方法,因为:

    1. 这是最灵活的
    2. 可读
    3. 仅在您需要的地方添加几个字节的代码
    4. 表现最佳

答案 1 :(得分:1)

另一个选项(如果您使用的是jQuery> 1.7):您可以使用jQuery.Callbacks函数。

cloneDetails(thisID, $.Callbacks()
    .add(initialiseDates, doSomethingElse, doAnotherThing));

function cloneDetails(cur_num, callBackFunctions) {

  /// do loads of stuff ///

  callBackFunctions.fire();

});