Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 避免使用eval()仅使用动态字符串按名称调用函数_Javascript_Node.js_Dynamic_Eval - Fatal编程技术网

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

Javascript 避免使用eval()仅使用动态字符串按名称调用函数,javascript,node.js,dynamic,eval,Javascript,Node.js,Dynamic,Eval,我有一个简单的开关块: function modifyServiceContractView(schema) { ... } function modifyContactView(schema) { ... } function addExtraInfoToSchema(defName, schema) { switch (defName) { case 'ServiceContractView': return modifyServiceCo

我有一个简单的开关块:

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()来执行此操作


希望我的问题很清楚。

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

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

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

使用键为名称、值为函数的对象

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

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

使函数成为对象属性:

return (f => f ? f(schema) : schema)({
    modifyServiceContractView,
    modifyContactView
}['modify' + defName]);

使函数成为对象属性:

return (f => f ? f(schema) : schema)({
    modifyServiceContractView,
    modifyContactView
}['modify' + defName]);

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

var modify={
ServiceContractView:函数(架构){
log('ServiceContract',schema);
},
ContactView:函数(架构){
log('Contact',schema);
}
};
函数addExtraInfoToSchema(defName,schema){
返回修改[defName](模式);
}
AddExtraffotoschema('ServiceContractView',1);

addExtraInfoToSchema('ContactView',2)您可以将函数存储在对象中,然后按名称访问它们

var modify={
ServiceContractView:函数(架构){
log('ServiceContract',schema);
},
ContactView:函数(架构){
log('Contact',schema);
}
};
函数addExtraInfoToSchema(defName,schema){
返回修改[defName](模式);
}
AddExtraffotoschema('ServiceContractView',1);

addExtraInfoToSchema('ContactView',2)是,使用对象文字来存储函数。。然后您可以执行func['modify'+defName](schema)duh:)谢谢我知道有一种方法可以将其添加为应答是的,使用对象文字来存储函数。。然后可以执行func['modify'+defName](schema)duh:)谢谢,我知道有一种方法可以将其添加为节点中不存在的应答
窗口。此外,将它们设置为全局(在节点中)是一个错误的决定,没有必要。
窗口
在节点中不存在。此外,将它们全局化(在节点中)是一个错误的决策,而且没有必要。