使用 window 来执行公式而不是使用 eval
Use window to execute a formula instead of using eval
我的代码需要执行一个 forumla(比如 Math.pow(1.05, mainObj.smallObj.count)
)。
我的路径是:
var path = mainObj.smallObj.count;
如你所见。
如果需要,我的代码可以从这个路径中拆分所有变量名并将其放入一个数组中,使其具有类似 :
var path = ["mainObj", "smallObj", "count"];
因为我不想使用eval
(这会导致内存泄漏,因为它会每秒被调用多次),我如何从window
访问它?
尝试了 window["path"]
或 window.path
。
如果总是不清楚,请告诉我。
在此先感谢您的帮助。
编辑:忘了说有些配置是用 JSON 写的,所以当我们采用公式时,它被解释为 "Math.pow(1.05, mainObj.smallObj.count)"
所以是一个字符串。
我想说有比 eval
更好的解决方案,但这取决于 forumla 的结构。它可以是 precompiled 使用 new Function
(这也是某种 eval)但是允许它被多次调用而不需要为每次调用重新编译。如果做得对,它应该比 eval
.
表现更好
你可以这样做:
var formula = {
code : 'Math.pow(1.05, mainObj.smallObj.count)',
params : ['mainObj']
}
var params = formula.params.slice(0);
params.push('return '+formula.code);
var compiledFormula = Function.apply(window, params);
//now the formula can be called multiple times
var result = compiledFormula({
smallObj: {
count: 2
}
});
您可以使用括号表示法递归地协调 path
部分:
window.mainObj = { smallObj: { count: 2 } };
var path = ["mainObj", "smallObj", "count"];
var parse = function (obj, parts) {
var part = parts.splice(0, 1);
if (part.length === 0) return obj;
obj = obj[part[0]];
return parse(obj, parts);
};
var value = parse(window, path);
alert(value);
基本上,parse
只是从数组中取出第一个元素,使用方括号表示法获取该对象,然后 运行 再次使用新缩短的数组对其进行处理。一旦完成,它只是 returns 无论最后 运行 的结果是什么。
这回答了您关于路径的大部分问题。如果您试图解释字符串的其余部分,@t.niese 的答案与其他答案一样好。真正的问题是您在您的应用上下文中信任来自外部源的代码 运行,这可能存在安全风险。
我的代码需要执行一个 forumla(比如 Math.pow(1.05, mainObj.smallObj.count)
)。
我的路径是:
var path = mainObj.smallObj.count;
如你所见。
如果需要,我的代码可以从这个路径中拆分所有变量名并将其放入一个数组中,使其具有类似 :
var path = ["mainObj", "smallObj", "count"];
因为我不想使用eval
(这会导致内存泄漏,因为它会每秒被调用多次),我如何从window
访问它?
尝试了 window["path"]
或 window.path
。
如果总是不清楚,请告诉我。
在此先感谢您的帮助。
编辑:忘了说有些配置是用 JSON 写的,所以当我们采用公式时,它被解释为 "Math.pow(1.05, mainObj.smallObj.count)"
所以是一个字符串。
我想说有比 eval
更好的解决方案,但这取决于 forumla 的结构。它可以是 precompiled 使用 new Function
(这也是某种 eval)但是允许它被多次调用而不需要为每次调用重新编译。如果做得对,它应该比 eval
.
你可以这样做:
var formula = {
code : 'Math.pow(1.05, mainObj.smallObj.count)',
params : ['mainObj']
}
var params = formula.params.slice(0);
params.push('return '+formula.code);
var compiledFormula = Function.apply(window, params);
//now the formula can be called multiple times
var result = compiledFormula({
smallObj: {
count: 2
}
});
您可以使用括号表示法递归地协调 path
部分:
window.mainObj = { smallObj: { count: 2 } };
var path = ["mainObj", "smallObj", "count"];
var parse = function (obj, parts) {
var part = parts.splice(0, 1);
if (part.length === 0) return obj;
obj = obj[part[0]];
return parse(obj, parts);
};
var value = parse(window, path);
alert(value);
基本上,parse
只是从数组中取出第一个元素,使用方括号表示法获取该对象,然后 运行 再次使用新缩短的数组对其进行处理。一旦完成,它只是 returns 无论最后 运行 的结果是什么。
这回答了您关于路径的大部分问题。如果您试图解释字符串的其余部分,@t.niese 的答案与其他答案一样好。真正的问题是您在您的应用上下文中信任来自外部源的代码 运行,这可能存在安全风险。