如果您在使用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。
編輯的問題 – Orrie