避免使用eval()通过名称仅使用动态字符串调用函数

时间:2016-10-05 21:21:17

标签: javascript node.js dynamic eval

我有这个简单的开关块:

function modifyServiceContractView(schema) {
     ...
}

function modifyContactView(schema) {
    ...
}


function addExtraInfoToSchema(defName, schema) {

  switch (defName) {

    case 'ServiceContractView':
      return modifyServiceContractView(schema);
      break;

    case 'ContactView':
      return modifyContactView(schema);
      break;

    default:
      return schema;

  }

}

而不是对开关块进行硬编码,只需要这样的东西就可以了:

function modifyServiceContractView(schema) {
    ...
}

function modifyContactView(schema) {
    ...
}


function addExtraInfoToSchema(defName, schema) {

    return eval('modify' + defName+ '(schema)');

}

有没有更好的方法可以在没有eval()的情况下执行此操作?

希望我的问题很明确。

3 个答案:

答案 0 :(得分:1)

使用一个对象,其键是名称,值是函数。

var modifyFuncs = {
    ServiceContractView: modifyServiceContractView,
    ContactView: modifyContactView
};

function addExtraInfoToSchema(defName, schema) {
    if (defName in modifyFuncs) {
        return modifyFuncs[defName](schema);
    } else {
        return schema;
    }
}

答案 1 :(得分:1)

如果您的功能是全局的,那么您可以这样做:

return window['modify' + defName] ? window['modify' + defName](schema) : schema;

答案 2 :(得分:1)

您可以将函数存储在对象中,然后按名称访问它们。

var modify = {
  ServiceContractView: function(schema) {
    console.log('ServiceContract', schema);
  },
  ContactView: function(schema) {
    console.log('Contact', schema);
  }
};

function addExtraInfoToSchema(defName, schema) {
  return modify[defName](schema);
}

addExtraInfoToSchema('ServiceContractView', 1);
addExtraInfoToSchema('ContactView', 2);