【问题标题】:javascript - eval SyntaxError: identifier starts immediately after numeric literaljavascript - eval SyntaxError:标识符在数字文字之后立即开始
【发布时间】:2026-02-03 04:00:01
【问题描述】:

我正在尝试使用 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() 行上的数字文字之后立即开始

我做错了什么?

【问题讨论】:

  • eval 评估 Javascript,2x 不是有效的 Javascript。你需要自己的解析器。
  • 我该怎么做?感谢您的帮助
  • 这并不复杂,但你必须学习一些东西。从这里开始:en.wikipedia.org/wiki/Parsing#Computer_languages

标签: javascript syntax-error eval


【解决方案1】:

在您的示例中,您调用 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') 提供包含函数术语的字符串,就可以使用此解析器。但 JessieCode 也需要乘法星。同样,这可以通过调用expandShortMath() 来解决。

var board = JXG.JSXGraph.initBoard('box', 
                {boundingbox: [-10, 10, 10, -10], axis:true});
board.create('functiongraph',[expandShortMath(field.value)]);

【讨论】:

    【解决方案2】:

    math.js 的表达式解析器在这里可能会派上用场。您可以执行以下操作:

    var f = math.eval('f(x) = 2x^3 - 5');
    console.log(f(2)); // outputs 11
    

    【讨论】: