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:)谢谢,我知道有一种方法可以将其添加为节点中不存在的应答窗口。此外,将它们设置为全局(在节点中)是一个错误的决定,没有必要。窗口
在节点中不存在。此外,将它们全局化(在节点中)是一个错误的决策,而且没有必要。