请问如何写一个方法替换eval提高执行效率?

发布于 2022-09-13 00:51:50 字数 137 浏览 10 评论 0

只要能实现带参数的函数的调用即可

function add(x, y) {
    return x + y;
}
console.log(eval('add(1,2)'));

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

倾城月光淡如水﹏ 2022-09-20 00:51:50

使用function?但不知道效率高不高

let str = 'add(1,2)'

eval('add(1,2)') // 3
new Function('return ' + str)() // 3
尸血腥色 2022-09-20 00:51:50

JS 函数的参数可以塞任何东西:

function testFunc(x, y){
  return x + y;
};

// 你可以这样调用:
testFunc(1, 2); // 3

// 而这样调用也不应该有问题:
testFunc(
  (   ( (
  (((       (  (  (
  ( ( (   ) =>  _ => $ => 2))
  ) ) )
  )  )   )    )   ) )( 
               )(  )(
  ),
  [function(Number_Duanduanduang$){
    const str = Number_Duanduanduang$ + ''
    return str.length - 1 ** 1e23 - 1 
  }][0](undefined * 1234875634627834628398472 / 12345)
); // 3

因此,只要你的要求是可以达到和 eval 一致的解析能力,就必须借助 JISON 等工具,写一个完整的 parser 出来。
几乎等同于用 JS 完整实现 eval,执行效率和原生的 eval 没得比。
所以除非加上一定的限制,比如传参必须是数字,那么倒是可以针对这个限制条件,写一个简单的解析器。
那么剩下的问题就只有executor 的实现了。
比如说,解析出来"testFunc"了,如何告诉引擎现在要执行一个叫 testFunc 的函数?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文