读书频道 > web开发 > Javascript > Effective JavaScript:编写高质量JavaScript代码的68个有效方法
第17条:间接调用eval函数优于直接调用
2013-12-07 15:23:50     我来说两句 
收藏    我要投稿   
本书共分为7章,分别涵盖JavaScript的不同主题。第1章主要讲述最基本的主题,如版本、类型转换要点、运算符注意事项和分号局限等。第2章主要讲解变量作用域,介绍此方面的一些基本概念,以及一些最佳实践经验。第  立即去当当网订购

eval函数有一个秘密武器:它不仅仅是一个函数。

大多数函数只能访问定义它们所在的作用域,而不能访问除此之外的作用域。然而,eval函数具有访问调用它那时的整个作用域的能力。这是非常强大的能力。当编译器编写者首次设法优化JavaScript时,他们发现eval函数很难高效地调用任何一个函数,因为一旦被调用的函数是eval函数,那么每个函数调用都需要确保在运行时整个作用域对eval函数是可访问的。

作为一种折中的解决方案,语言标准演化出了辨别两种不同的调用eval函数的方法。函数调用涉及eval标识符,被认为是一种“直接”调用eval函数的方式。

 

在这种情况下,编译器需要确保被执行的程序具有完全访问调用者局部作用域的权限。其他调用eval函数的方式被认为是“间接”的。这些方式在全局作用域内对eval函数的参数求值。例如,绑定eval函数到另一个变量名,通过该变量名调用函数会使代码失去对所有局部作用域的访问能力。

直接调用eval函数的确切的定义取决于ECMAScript标准相当特殊的规范语言。在实践中,唯一能够产生直接调用eval函数的语法是可能被(许多的)括号包裹的名称为eval的变量。编写间接调用eval函数的一种简洁方式是使用表达式序列运算符(,)和一个明显毫无意义的数字字面量。

 

这个奇形怪状的函数调用是如何工作的呢?数字字面量0被求值但其值被忽略掉了,括号表示的序列表达式产生的结果是eval函数。因此,(0,eval)的行为几乎与简单的eval函数标识符完全一致,一个重要的区别在于整个调用表达式被视为是一种间接调用eval函数的方式。

直接调用eval函数的能力可能很容易被滥用。例如,对一个来自网络的源字符串进行求值,可能会暴露其内部细节给一些未受信者。第16条探讨了使用eval函数动态创建局部变量的危害。这些危害只可能与直接调用eval函数相关。此外,直接调用eval函数性能上的损耗也是相当高昂的。通常情况下,你要承担直接调用eval函数导致其包含的函数以及所有直到程序最外层的函数运行相当缓慢的风险。

出于某些原因偶尔也需要使用直接调用eval函数。但是,除非有一个检查局部作用域的特别能力的明确需求,否则应当使用更不容易滥用、更廉价的间接调用eval函数的方式。

 提示

将eval函数同一个毫无意义的字面量包裹在序列表达式中以达到强制使用间接调用eval函数的目的。

尽可能间接调用eval函数,而不要直接调用eval函数。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:第16条:避免使用eval创建局部变量
下一篇:Node.js高级编程
相关文章
图文推荐
3.12 本章小结
3.10 添加新函数
3.9 递归
3.8 闭包
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站