抛弃eval吧。

llyy112233 2011-05-30 02:56:24
加精
刚看了这篇帖子 eval 获得对象用法 请教达人 有点感想,发上来供大家参考。

eval在javascript语言精粹中被作者归为js的鸡肋特性之一,刚温习了下本书,下面是该书对eval的描述:

eval函数传递一个字符串给javascript编译器,并且执行其结果。它是一个被滥用得最多的javascript特性。那些对javascript语言一知半解的人们最常用到它。例如:如果你知道点表示法,但不知道下标表示法,就可能会这么写:

eval("myValue = myObject." + myKey + ";");


而不是这么写:

myValue = myObject[myKey];


使用eval形式的代码会更加难以阅读。这种形式将使得性能显著降低,因为它必须运行编译器,但也许只是为了执行一个微不足道的赋值语句。它会让JSLint失效,因此该工具检测问题的能力也会显著降低。

eval函数还减弱了你的应用的安全性,因为它给被求值的文本赋予了太多的权力。而且就像with语句执行的方式一样,它降低了语言的性能。

Function构造器是eval的另一种形式,所以它同样也应该被避免使用。

浏览器提供的setTimeout和setInterval函数,它们能接收字符串参数或函数参数。

当传递的是字符串参数时,setTimeout和setInterval会像eval那样去处理。字符串参数形式也应该被避免使用。



个人在开发中没有碰到过必须用eval的时候,都可以用别的形式替换,所以让我们抛弃eval吧。
...全文
14176 138 打赏 收藏 转发到动态 举报
写回复
用AI写文章
138 条回复
切换为时间正序
请发表友善的回复…
发表回复
小码夫 2014-02-08
  • 打赏
  • 举报
回复
新手混经验.............
ImN1 2013-11-22
  • 打赏
  • 举报
回复
引用 136 楼 maobushigou 的回复:
[quote=引用 3 楼 snmr_com 的回复:] ajax怎么处理扔过来的js呢?
现在大部分都提供了专门的函数来解析json[/quote] 你好像没分清 js 和 json 的概念 两年前的坟就不要挖了吧……
binary_hackboy 2013-11-22
  • 打赏
  • 举报
回复
引用 3 楼 snmr_com 的回复:
ajax怎么处理扔过来的js呢?
现在大部分都提供了专门的函数来解析json
yksyuan 2013-06-25
  • 打赏
  • 举报
回复
呃,ajax读取的json时怎么代替啊?
pichunhan 2013-06-25
  • 打赏
  • 举报
回复
[quote=引用 11 楼 wtcsy 的回复:] [Quote=引用 3 楼 snmr_com 的回复:] ajax怎么处理扔过来的js呢? [/Quote] lz 都说了可以用new Function [code=JScript]var c = new Function('return {a:"b"}')(); alert(c.a);[/cod ge] 我个人觉得这个比eval的可读性更差.除了卖弄下,没有其他功能
hetengfei_ 2011-11-24
  • 打赏
  • 举报
回复
try
{
eval('$("#btnCheck").val($("#"'+$("#txtIn").length+'));');
}
catch(ex)
{
$("#btnCheck").val("输入的是非法字串");
}
hetengfei_ 2011-11-24
  • 打赏
  • 举报
回复
我问你一个问题,你解快才服你,不用eval () 就搞不定这个问题。
// 一个在线 控件查找器。

<input type="text" id="txtIn" />
<textarea id="txtOut" row='20' col='80'/>
<input type="button" id="btnCheck" value="IsTheControlsAtThePage"/>

用eval 的方法如下:
try
{
eval('$("#btnCheck").val($("#"'+$("#txtIn")+'));');
}
catch(ex)
{
$("#btnCheck").val("输入的是非法字串");
}

不是我说你 要反对eval
你不用eval 怎么做得到?(就算做到了,也是绞尽脑子)



loveelwin 2011-10-08
  • 打赏
  • 举报
回复
eval相当于在运行时再次调用解释引擎对内容进行解释运行,这会消耗大量的时间。并且貌似eval可以破解闭包中的私有域属性,并对其进行修改,这就会导致不安全。 同时,对于eval,可以使用javascript闭包实现函数模板以替代eval()方法。
hans8 2011-08-19
  • 打赏
  • 举报
回复
刚学习js时候,一些动态调用很是头疼,直道某天知道了eval,js怎么会有这么强力的方法!

从此觉得eval就像神一般,一直被我当做秘密武器,因为我相信遇到再棘手的,eval也能帮我解决!

慢慢地懂的多了点,eval出场率少了,但是eval如定海针一样陪伴我成长。。。

必须膜拜eval!!!
iLove9ouHenry 2011-07-23
  • 打赏
  • 举报
回复
dingding!
wangzhen1985 2011-06-14
  • 打赏
  • 举报
回复
基本不用
mayazxf427 2011-06-12
  • 打赏
  • 举报
回复
学习,路过
iever123 2011-06-10
  • 打赏
  • 举报
回复
就没用过,何来抛弃。。。
sunguojuan 2011-06-10
  • 打赏
  • 举报
回复
还不错、、
jiambet 2011-06-10
  • 打赏
  • 举报
回复
围观下
c__sys 2011-06-09
  • 打赏
  • 举报
回复
我用过:
obj=eval('document.cb_cart.text_unitprice_' + $shipping_charge_cnt);

jquery也用过,jquery ui:
inlineSettings[attrName] = eval(attrValue);
maqiang19890723 2011-06-08
  • 打赏
  • 举报
回复
收获巨大!
笑是我的药 2011-06-08
  • 打赏
  • 举报
回复
我也觉得应该少用~~~
nana1216peng 2011-06-08
  • 打赏
  • 举报
回复
受益匪浅,谢谢楼主
krqw 2011-06-08
  • 打赏
  • 举报
回复
asp 用的多 ,也可以选择不用
加载更多回复(100)

87,920

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧