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
进行用户输入时,会产生一个潜在问题。@如果您想创建一种计算器,请使用