我正在尝试使用JSXGraph来显示用户在文本字段中输入的功能。
这是我的代码:
var board = JXG.JSXGraph.initBoard('box', {boundingbox: [-10, 10, 10, -10], axis:true});
eval("function f(x){ return "+field.value+";}");
board.create('functiongraph',[function(x){ return f(x); }]);
当用户输入如下内容时,此代码可以正常工作:2 * x 但是当用户输入:2x(没有*)时,它不起作用,我得到: SyntaxError:标识符在eval()行上的数字文字后立即开始
我做错了什么?
答案 0 :(得分:0)
在您的示例中,您调用eval()
来创建一个新的JavaScript函数,该函数随后会被绘制。当然,那么你必须提供正确的JavaScript。
第一个简单的增强功能是将digit letter
的所有组合替换为digit*letter
。例如,将2x
替换为2*x
,将(1+2)x
替换为(1+2)*x
。这可以使用以下正则表达式完成。
/**
* Expand math expressions with suppressed multiplication dots.
* Examples
* 2x -> 2*x
* (2+3)(3+1) -> (2+3)*(3+1)
* Attention with exponents:
* x^2x -> x^2*x
*/
expandShortMath = function(expr) {
var re = /([\)0-9\.])\s*([\(a-zA-Z_])/g;
return expr.replace(re, '$1*$2');
};
在你的例子中,你会像这样使用它:
eval("function f(x){ return " + expandShortMath(field.value) + ";}");
board.create('functiongraph',[function(x){ return f(x); }]);
但是,出于安全考虑,最好避免调用eval()
。出于这个原因,JSXGraph自带了数学脚本语言JessieCode的解析器。只需向board.create('functiongraph')
提供包含函数term的字符串即可使用此解析器。但JessieCode也需要乘法星。同样,这可以通过调用expandShortMath()
来解决。
var board = JXG.JSXGraph.initBoard('box',
{boundingbox: [-10, 10, 10, -10], axis:true});
board.create('functiongraph',[expandShortMath(field.value)]);
答案 1 :(得分:0)
math.js的表达式解析器可能会派上用场。你可以这样做:
var f = math.eval('f(x) = 2x^3 - 5');
console.log(f(2)); // outputs 11