eval和with对性能的影响
2017-01-01 10:48
363 查看
javascript中使用eval和with一直被认为是一个不好的主意,他们对性能的影响是很大的,在说明性能之前我们先看看这两种机制都是什么样子的。
上面代码运行结果是控制台输出打印了1,而str只是一个字符串参数。看着好像是可以动态的生成代码了,我们再来看如下的代码:
可以看到控制台输出的结果是2和3,而并不是1和3,为什么呢?显而易见eval函数将
看着貌似是访问对象的属性变得方便了很多,我们再来看下面地例子:
可以看到当s1有a属性,s2没有a属性,输出s1的a属性值时输出了2,也就是说with改变了当前的词法作用域,再看s2上的a属性(其实没有a属性)输出了undefined,挺正常,但是当输出a时就变为了2,也就是with弄出了个新的作用域。
以上是本人对eval和with对性能影响的理解,有错误的话望指正~~
eval
javascript中的eval函数可以接受一个字符串作为它的参数,并能将该参数作为代码进行执行,也就是说在你写代码的地方可以生成代码并运行,来看如下代码:var str="console.log(1)"; eval(str); //1
上面代码运行结果是控制台输出打印了1,而str只是一个字符串参数。看着好像是可以动态的生成代码了,我们再来看如下的代码:
function foo(str,a){ eval(str); console.log(b,a); } var b=1; var s="var b=2"; foo(s,3) //2 3
可以看到控制台输出的结果是2和3,而并不是1和3,为什么呢?显而易见eval函数将
var b=2这个字符串参数当成代码运行了,而引擎执行的时候会在当前作用域内对b执行RHS查询的时候找到b值,相应的会覆盖掉外层作用域的值,也就是说它会改变词法作用域。(不了解RHS查询和词法作用域的同学可以看下我的这篇文章什么是作用域及js编译原理)
with
with通常被当做是应用一个对象的引用,在引用对象属性时候,不用重复引用对象本身,来看下面的例子:var s1={ a:1, b:2, c:3 }; //调用其属性值得时候需要重复引用对象本身 s1.a=2; s1.b=3; s1.c=4; //使用快捷方式 with(s1){ a=2; b=3; c=4; }
看着貌似是访问对象的属性变得方便了很多,我们再来看下面地例子:
function foo(obj){ with(obj){ a=2; } } var s1={ a=3; }; var s2={ b=3 }; foo(s1); console.log(s1.a)//2 foo(s2); console.log(s2.a)//undefined console.log(a)//2 a变为全局作用域上去了
可以看到当s1有a属性,s2没有a属性,输出s1的a属性值时输出了2,也就是说with改变了当前的词法作用域,再看s2上的a属性(其实没有a属性)输出了undefined,挺正常,但是当输出a时就变为了2,也就是with弄出了个新的作用域。
性能问题
通过以上对eval和with基本原理的解释,我们基本就该大概知道了它们对性能是如何影响的,当编译器编译代码的时候会预先查找所声明的变量和函数位置,当遇见eval和with语句的时候,它们会不知所措。。。因为这两个家伙会改变当前的词法作用域,导致引擎在执行代码的时候也会变得不知所措。导致运行的时候回变得非常缓慢。以上是本人对eval和with对性能影响的理解,有错误的话望指正~~
相关文章推荐
- javascript中的eval和with语句如何影响性能
- js 解释器的尾调用优化机制 with 和 eval对性能的影响
- 浅谈 js 下 with 对性能的影响
- JavaScript欺骗词法的eval、with与catch及其性能问题
- 性能测试机中存在大量的TIME_WAIT状态的连接,影响并发压力的发起
- IO模式设置,阻塞与非阻塞的比较,recv参数对性能的影响
- 10个影响性能的问题
- 深入解析:Row Movement 的原理和性能影响与关联
- 影响SQL Server性能的三个关键点
- JS-cookie的作用?如何操作cookie?设置cookie对性能的影响?
- 数组累加兼eval性能测试
- java异常处理对性能的影响
- J2EE系统中影响性能的一些因素
- php影响性能的经验总结
- shared pool 相关latch出现异常等待,影响系统性能
- SQL Server中多表连接时驱动顺序对性能的影响
- 圆角效果实现,圆角效果对性能的影响及优化
- ToList<>()所带来的性能影响
- IO模式设置,阻塞与非阻塞的比较,recv参数对性能的影响
- 吞吐量(Throughput)、QPS、并发数、响应时间(RT)对系统性能的影响