Javascript 在eval()中导入数学命名空间

Javascript 在eval()中导入数学命名空间,javascript,Javascript,我将函数源存储在字符串中,例如: var source="(function(){return Math.sin(x);})"; 我想将其传递到eval()并在以后计算其值: var f=eval(source); var v=f(); 它工作得很好。但是,我希望能够使用Math中的函数,而不使用Math.前缀。因此,我能够做到: var source="(function(){return sin(x);})"; 有没有一个简单的方法来实现这一点?我已经使用了WebGL,所以它不必与旧的

我将函数源存储在字符串中,例如:

var source="(function(){return Math.sin(x);})";
我想将其传递到
eval()
并在以后计算其值:

var f=eval(source);
var v=f();
它工作得很好。但是,我希望能够使用
Math
中的函数,而不使用
Math.
前缀。因此,我能够做到:

var source="(function(){return sin(x);})";
有没有一个简单的方法来实现这一点?我已经使用了WebGL,所以它不必与旧的浏览器兼容

其他信息:

我知道
eval()
不好。我在写函数图示器,
source
是用户输入的函数,它将被绘制。这也是为什么我们想摆脱
数学。
前缀


我知道这不会很好,但我不会编写自己的解析器。也许有更好的办法

您可以使用古老、缓慢、丑陋的
关键字来扩展范围:

var source="(function(){return sin(x);})";
with (Math) {
    var f=eval(source);
    var v=f();
}

另请参见:

您可以使用带有关键字的古老、缓慢、丑陋的
来扩展范围:

var source="(function(){return sin(x);})";
with (Math) {
    var f=eval(source);
    var v=f();
}
另请参见:

为此,您可以使用

var source="(function(){return Math.sin(x);})";
with(Math){
    var f = eval(source);
    var v = f();
}
另请参见:

您可以为此目的使用

var source="(function(){return Math.sin(x);})";
with(Math){
    var f = eval(source);
    var v = f();
}

另请参见:如果要使用
eval()
,也许可以使用用户输入的函数,并执行一些不区分大小写的全局替换:

var source = document.getElementById("someInputBox").value;
source = source.replace(/sin/ig,"Math.sin");
source = nsource.replace(/cos/ig,"Math.cos");
source = source.replace(/sqrt/ig,"Math.sqrt");
source = source.replace(/pi/ig,"Math.PI");
source = source.replace(/^/ig,"Math.PI");
source = source.replace(/([a-z]|\d+(?:\.\d+)?)*\s*\^\s*([a-z]|\d+(?:\.\d+)?)/ig, "Math.pow($1, $2)");
result = eval(source);

重要提示:替换
Math.pow()
对高级幂表达式不起作用,例如
5^(5-3^(2*2))
。你需要找到一个更先进的战略。这在
PHP
中有一个解决方案,可以将其转换为
javascript

如果要使用
eval()
,也许可以使用用户输入的函数并进行一些全局的、不区分大小写的替换:

var source = document.getElementById("someInputBox").value;
source = source.replace(/sin/ig,"Math.sin");
source = nsource.replace(/cos/ig,"Math.cos");
source = source.replace(/sqrt/ig,"Math.sqrt");
source = source.replace(/pi/ig,"Math.PI");
source = source.replace(/^/ig,"Math.PI");
source = source.replace(/([a-z]|\d+(?:\.\d+)?)*\s*\^\s*([a-z]|\d+(?:\.\d+)?)/ig, "Math.pow($1, $2)");
result = eval(source);

重要提示:替换
Math.pow()
对高级幂表达式不起作用,例如
5^(5-3^(2*2))
。你需要找到一个更先进的战略。这在
PHP
中有一个解决方案,它可能被转换成
javascript

关于
eval
的安全性和兼容性的争论。除此之外,在这个用例中,可以通过部分评估来避免性能损失

如果
fstring
是包含用户输入的字符串,如
“x*cos(x)”


将基于
fstring
中的代码创建函数
f
f
可快速应用于一系列值,以生成图形计算器输出。当创建
f
时,通过
with
进行命名空间查找的性能损失只发生一次

关于
eval的安全性和兼容性的争论
撇开不谈,在这个用例中,可以通过部分评估来避免性能损失

如果
fstring
是包含用户输入的字符串,如
“x*cos(x)”


将基于
fstring
中的代码创建函数
f
f
可快速应用于一系列值,以生成图形计算器输出。当创建
f
时,通过
with
进行命名空间查找的性能损失只发生一次

将代码存储为字符串有什么原因吗?为什么不将函数文本存储在变量中,这样就可以避免求值?您不想使用
数学。
?为什么要使用
eval
?只要存储
var f=Math.sin
,如果您需要的不仅仅是包装一个现有函数,请使用一个异常函数。你在打破轮子上的蝴蝶。这是一个非常丑陋,危险,缓慢的轮子启动。问题:当你键入“eval”时,你有没有发抖?如果不是,我可能会建议找到一个替代的解决方案。如果是这样的话,你已经通过了我关于使用危险物品的测试…:)你将代码存储为字符串有什么原因吗?为什么不将函数文本存储在变量中,这样就可以避免求值?您不想使用
数学。
?为什么要使用
eval
?只要存储
var f=Math.sin
,如果您需要的不仅仅是包装一个现有函数,请使用一个异常函数。你在打破轮子上的蝴蝶。这是一个非常丑陋,危险,缓慢的轮子启动。问题:当你键入“eval”时,你有没有发抖?如果不是,我可能会建议找到一个替代的解决方案。如果是这样的话,你已经通过了我关于使用危险物品的测试…:)+1,但是这里有一些额外的警告:可以,但不应该,就像不应该使用eval一样。这也很糟糕,因为它是晦涩难懂的语法,很多人在以后试图维护代码时都不会意识到这会造成混乱。@Quentin:我完全同意你所说的
“eval”.replace(“a”,“I”)
,但由于我不知道程序的背景,因此很难提出更好的解决方案。使用
with
让我想起五年前的代码,比如
with(document.all){field.value=1;}
。丑陋(
document.all
)与丑陋(
with
)+1组合,但这里有一些额外的警告:可以,但不应该,就像不应该使用eval一样。这也很糟糕,因为它是晦涩难懂的语法,很多人在以后试图维护代码时都不会意识到这会造成混乱。@Quentin:我完全同意你所说的
“eval”.replace(“a”,“I”)
,但由于我不知道程序的背景,因此很难提出更好的解决方案。使用
with
让我想起五年前的代码,比如
with(document.all){field.value=1;}
。丑陋(
document.all
)与丑陋(
with
)@Banthar相结合如果你想创建一种计算器,使用
eval
将是懒惰的。当您的应用程序使用
eval
进行用户输入时,会产生一个潜在问题。@如果您想创建一种计算器,请使用