在 Javascript 中计算方程,不使用 eval()

And*_*w M 6 javascript eval

我在网页 (150+) 中有一堆字段,需要在它们上运行方程式才能产生结果。

我目前存储这样的方程:

<input name="F7" type="text" class="numeric" data-formula="([C7]-[D7])/[E7]" readonly />
Run Code Online (Sandbox Code Playgroud)

当输入模糊时,我使用 jQuery 选择器遍历所有具有data-formula属性的输入,采用公式,并使用正则表达式替换指针([C7]等式中的 )替换为其适当的值。

之后,我eval()将方程得到一个结果,并将其放入正确的输入中。这很好用,但速度慢,导致网页挂起几秒钟,如果每次输入模糊时都会发生这种情况,这很糟糕。

有没有一种方法可以在不使用的情况下评估一个方程,例如“(1-2)/4” eval()?这些方程也可能有函数,例如平方根(这eval()很好,因为我可以直接Math.sqrt()输入公式),并且数字可能是小数。

注意:这个应用程序必须在 IE7 和 8 上运行,所以我不相信我可以使用 Webworkers 或类似的东西。我还考虑过仅在点击“保存”按钮后运行此代码,但如果可能,我更希望用户界面实时更新

Mat*_*ott 5

我只真正知道两种选择,一种是使用script动态写入页面的元素,例如:

function evaluate(formula)
{
  var script = document.createElement("script");
  script.type = "text/javascript";
  script.text = "window.__lr = " + formula + ";";
  document.body.appendChild(script);
  document.body.removeChild(script);

  var r = window.__lr;

  return r;
}
Run Code Online (Sandbox Code Playgroud)

另一种是使用new Function(...)

function evaluate3(formula)
{
  var func = new Function("return " + formula);
  return func();
}
Run Code Online (Sandbox Code Playgroud)

但我不认为你会发现产生类似性能的东西evalhttp : //jsperf.com/alternative-evaluation

性能eval因浏览器和平台而异,您是否考虑过特定​​的浏览器/平台组合?改进的浏览器中较新的 javascript 引擎将提供优化的eval

检测结果

这只是针对少数 UA 的一组有限测试,但它应该能让您了解它在不同环境中的表现。