如何通过名称执行带参数的函数

时间:2017-09-25 13:46:39

标签: javascript ecmascript-6

我需要一种方法来执行具有参数的函数:

func1(param1, param2) 
{...
}

当我在另一个函数中获取函数名称及其参数作为参数(或字符串变量)时:

parentFunc()
{
  var funcName="func1";
  var params = {'param1': 'A', 'param2': 'B'}
   //Here I want to execute the funcName (func1) with its params.
}

我尝试过创建customEvent,但是param没有通过:

var event = new CustomEvent("func1", { 
  "param1": 'A', "param2": 'B'
});

this.element.dispatchEvent(event);//The element is the "parent" 
                                  //htmlElement that responsible to the 
                                  //event

*这些功能不在同一个文件中,我在单页应用程序(SPA)中进行,所以如下所示这样做不够好:

var fn = window[settings.functionName];

通常 - 我要做的是在自定义元素中 - 当自定义元素中有事件时,可以选择决定执行哪个函数(它在父模板中)

4 个答案:

答案 0 :(得分:1)

请考虑向您的函数发送其他内容而不是要执行的函数的名称。您可以尝试例如条件和要执行的函数之间的映射。但是,如果您的心脏被设置为发送函数名称,或者您没有办法不这样做,那么您的朋友就是eval函数:

function evaluate(name, params) {
    let toExecute = (name || 'eval') + '(';
    params = (params instanceof Object ? params : {});
    for (let key in params) {
        toExecute += params[key] + ', ';
    }
    if (toExecute[toExecute.length - 2] === ',') {
        toExecute = toExecute.substr(0, toExecute.length - 2);
    }
    toExecute += ');';
    eval(toExecute);
}

function parentFunc() {
    var funcName="func1";
    var params = {'param1': 'A', 'param2': 'B'}

    //Here I want to execute the funcName (func1) with its params.
    evaluate(funcName, params);
}

请花点时间阅读使用eval here的危险。

答案 1 :(得分:0)

您可以将名称函数作为回调传递给回调:

|    PK_ | FK_trans | PK_TransID = FK_trans | FK_expense |  ExpenseNumber |
|--------|----------|-----------------------|------------|----------------|
| (null) |   (null) |                     1 |     (null) |         (null) |
| (null) |   (null) |                     2 |     (null) |         (null) |
| (null) |   (null) |                     3 |     (null) |         (null) |
| (null) |   (null) |                     4 |     (null) |         (null) |
| (null) |   (null) |                     5 |     (null) |         (null) |
|      1 |        6 |                     6 |        121 |    378cb082017 |
| (null) |   (null) |                     7 |     (null) |         (null) |
| (null) |   (null) |                     8 |     (null) |         (null) |
|      2 |        9 |                     9 |        115 |         (null) |
| (null) |   (null) |                    10 |     (null) |         (null) |
| (null) |   (null) |                    11 |     (null) |         (null) |
|      3 |       12 |                    12 |        110 |         (null) |
| (null) |   (null) |                    13 |     (null) |         (null) |
|      9 |       14 |                    14 |        123 | 22650820170301 |
|      4 |       15 |                    15 |        118 |         (null) |
|      5 |       16 |                    16 |        111 |        0070317,4642k1045917,10235k1071417,9948k2054917 |

如果你想要params的功能:

parentFunc(funcName)
{
        var params = {'param1': 'A', 'param2': 'B'}
        funcName(params);
}

parentFunc(funcName, param) { funcName(param); }

答案 2 :(得分:0)

我真的不明白你想要实现的目标。但我会做这样的事情:

var myObject = {
  func1: func1
};

function parentFunc() {
  var funcName="func1";
  var params = {'param1': 'A', 'param2': 'B'};
  myObject[funcName](params.param1,params.param2);     
}

parentFunc();

function func1(param1, param2) {
  console.log(param1);
  console.log(param2);
}
希望它有所帮助。

答案 3 :(得分:0)

我设法在奥里利亚做到了: 这是带有foucusout.trigger的自定义元素,它在适当的时间调用focusoutAction:

<template>
 <label>
   ${title} - ${fieldName}<input title.bind="title" 
   focusout.trigger="focusoutAction()" focusin.trigger="focusInAction()" 
   class="${cssClass}" />
  </label>
</template>

这是使用focusout.call属性在父视图中使用自定义元素:

 <form-input field-name="firstName" title="First Name" 
 place-holder="Enter first name" 
 on-focusout.call="validateInput(nameOfElement)" />

这是自定义控件的视图模型中的相关代码:

@bindable onFocusout;

focusoutAction() {

   var args =
   {
      nameOfElement: this.fieldName
   };
   this.onFocusout(args);
}