前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >web 页面在浏览器运行eval性能分析和优化

web 页面在浏览器运行eval性能分析和优化

作者头像
星宇大前端
发布2023-04-21 21:25:21
5480
发布2023-04-21 21:25:21
举报
文章被收录于专栏:大宇笔记大宇笔记

公司有个低代码老项目,里面有一些自定义脚本运行使用了大量的eval 动态运行。

分析

网上对eval 的争论也非常激烈,大部分不建议使用,一些人观点是用不好才导致问题。

eval 是否真的存在效率问题? eval is evil

我们知道new Function 也可以实现动态运行代码,但是这样就产生了作用域问题。eval是没有作用域的。

mdn文档

在这里插入图片描述
在这里插入图片描述

对于安全方面,使用eval 存在漏洞不在分析范围。

试验

我们对比evalnew Function 两种动态运行js 的功能和效率

基本功能使用全局变量

代码语言:javascript
复制
      window.a = '全局变量a'
      var scriptStr = "console.log(window.a)";
      eval(scriptStr);
      let func = new Function(scriptStr);
      func();

**结果对比:**两个都能访问到,且能执行脚本

在这里插入图片描述
在这里插入图片描述

作用域

代码语言:javascript
复制
    function test() {
      var a = '局部变量a'
      var scriptStr = "console.log(a)";
      eval(scriptStr);
      let func = new Function(scriptStr);
      func();
    }
    test();

结果: eval 没有作用域,function 可以通过传参的方式解决这个问题

在这里插入图片描述
在这里插入图片描述

性能对比

遍历相同的次数,用两种方式分别执行

代码语言:javascript
复制
   function test() {

        var forStr =
          "for (let index = 0; index < 10000000; index++) { var a = 10;a = a * index;};";
        console.time("foreval");
        eval(forStr);
        console.timeEnd("foreval");
        console.time("forFunc");

        let forFunc = new Function("a",forStr);
        forFunc(a);
        console.timeEnd("forFunc");

      }

      test();

结果:

在这里插入图片描述
在这里插入图片描述

差异巨大,func 更优秀

结论

  • eval 没有作用域,function 可以通过传参的方式解决这个问题
  • function效率远高于eval
  • 安全性function 高于eval

推荐function 替代 eval

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 分析
  • 试验
    • 基本功能使用全局变量
      • 作用域
        • 性能对比
        • 结论
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
        http://www.vxiaotou.com