没有#eval的Metaprogramming JS函数

时间:2014-06-11 15:45:44

标签: javascript

我一直在尝试动态调用JS中的函数。在我目前的情况下,我正在使用eval来构建并根据其父级参数调用正确的函数名称。这是一个例子:

Comments“类”中:

$scope.getComments = function(id) {
  return getApiData(id, "comments");
};

getApiData = function(id, field) {
  eval("BackendApi.get" + (field.capitalize()) + "(" + id + ")");
  // do something else with `field` down here
};

BackendApi是一个简单的REST服务。我试图动态调用这些函数的原因是因为我发现自己编写了大量重复代码。我read eval通常被认为是不良做法,可能与糟糕的表现有关。在上面的例子中,我将尝试使用以下语法调用函数:

BackendApi.getComments(:id);

请注意,Comments#$scope.getCommentsBackendApi#getComments为其各自的“类”共享相同的函数名称。我遇到的最大问题是"get" + field部分。是否可以调用getApiData而不是"get"的调用函数的名称加上静态字段名作为参数?我很感激帮助,如果我歪曲了JS的任何部分,我会道歉。

1 个答案:

答案 0 :(得分:1)

您可以使用数组表示法按名称访问属性:

getApiData = function(id, field) {
    return BackendApi['get' + field.capitalize()](id);
}