如果您事先知道变量名称,则可以轻松地将字符串转换为函数Function()
。第一个参数是你的函数参数,最后一个是你的函数体。
var func1 = Function('avgFrags', 'return avgFrags * 250;');
这相当于:
function func1(avgFrags) {
return avgFrags * 250;
}
已知函数签名
如果您知道本地存储中的每个项目将使用哪些变量名称,那么您应该很容易使用函数执行您想要的操作:
// from your edited question
form_frag = localStorage.getItem('formula_frag');
form_dmg = localStorage.getItem('formula_dmg');
// ... create functions
var fragsFunc = Function('avgFrags', form_frg );
var dmgFunc = Function('avgDmg', 'avgTier', form_dmg );
// ... get frags
var frags = fragsFunc (10); // frags = 2500; // if sample in storage
未知函数签名
现在,如果您的变量名称数量有限并且您不知道每个函数将使用哪些变量名称,那么您可以执行以下操作:
var avgFrags, avgDamage, avgTier, avgSpots, avgCap, avgDef;
// ... get from storage
form_frag = localStorage.getItem('formula_frag');
form_dmg = localStorage.getItem('formula_dmg');
// ... create functions
var fragsFunc = Function('avgFrags', 'avgDamage', 'avgTier', 'avgSpots', 'avgCap', 'avgDef', form_frag);
var dmgFunc = Function('avgFrags', 'avgDamage', 'avgTier', 'avgSpots', 'avgCap', 'avgDef', form_frag);
// ... get frags, only the first argument is used, but we don't know that.
var frags = fragsFunc (avgFrags, avgDamage, avgTier, avgSpots, avgCap, avgDef); // frags = 2500; // if sample in storage
您可以通过将一个变量传递给函数来简化此操作,该变量是一个对象,其中包含可以传递给函数的所有参数。只需确保函数编写器使用该对象。
var settings = {
avgFrags: 10,
avgDamage: 50,
// ...
};
var fragsFunc = Function('s', 's.avgFrags * 250');
var frags = fragsFunc (settings);
使用正则表达式获取零件
我假设以上内容将完成工作,您并不真正想要具有变量名称、数字和运算符的对象。
如果您只需要变量名称和数字(和运算符),您可以使用正则表达式。
([a-z_$][\w\d]*)|([0-9]*\.?[0-9]+)|([^\w\d\s])
您可以使用它为每个部分创建一个数组。每个部分也被分组,所以你知道哪个是变量名,哪个是数字,哪个是另一个(括号或运算符)
var re = /(\w[\w\d]*)|([0-9]*\.?[0-9]+)|([^\w\d\s])/g,
match,
results;
while ((match = re.exec(localStorage.getItem('formula_frag'))) {
results.push({
text: match[0],
type: (match[1]) ? 'var' | (match[2]) ? 'number' : 'other'
})
}
您可以使用REY查看带有示例数据的正则表达式的输出。