eval() 是一個相當有趣、強大、不容易理解的函式,但功用實在太強,撰寫 Javascript 時經常會使用到。
eval 是 evaluates 的簡寫,是用來將「一句話」執出來。例如:
| var n=3; var b=5,c=6; eval('a'+n+'=b*c'); |
上例,在 eval() 中的字串,展開變成
| a3=b*c |
沒錯,結果就是 a3=b*c,也就是變數 a3 的結果為 30。
由上例可知,eval() 是把一串字串,當作指令來執行,並得出結果,實作時,在訂單處理上應用較廣,例如以下是份簡單訂單:
很基本的訂單,欄位後是欄位名稱,我想大多數設計師,都會像這個例子,用編號來進行不同筆數訂單欄位命名,而不是每個欄位獨立命名,顯示,在輸入數量及單價後,小計要能自動計算,也就是:
T1=Q1*P1 、 T2=Q2*P2 以及 T3=Q3*P3
假設這份表單名為 order,所以:
| document.order.T1.value=document.order.Q1.value*document.order.P1.value; document.order.T2.value=document.order.Q2.value*document.order.P2.value; document.order.T3.value=document.order.Q3.value*document.order.P3.value; |
你是不是會想用 for 來跑迴圈?可是,T1、;Q1 這些欄位名稱一直在變,怎麼跑迴圈呢?這時,eval() 就派上用場了,eval() 把「唸的內容」當結果執行,這個例子怎麼唸呢?
「第一個 T 的值等於第一個 Q 的值乘以第一個 P 的值」,換成 eval():
|
var form=document.order; for (var i=1;i<=3;i++){
} |
把 eval() 裡的字串,i 的值分別用 1,2,3 套入,結果和前面寫一大串三行的效果一模一樣。
不錯用吧!
卜維丰 4/11 07'
同意轉載,不過麻煩看一下轉載需知
QOO 2010/1/14 下午 03:43:00
講的真不錯。
chiyaki 2009/12/23 上午 11:00:00
啊啊~我懂了
簡言之是 字串與變數混合運用
可以把我下面的留言刪掉嗎
感謝
chiyaki 2009/12/23 上午 10:53:00
在例子中感覺把
eval拿掉
也可以得到同樣的結果吧..
orson 2009/9/23 上午 10:58:00
之前有看過此函數因講得不清楚,所以就沒去注意。看完你的講解,真是不錯,懂了。
Kei 2009/9/21 上午 11:55:00
我懂了 XD
卜維丰 2008/7/3 下午 05:23:00
francois, 你第一行就存在很大風險了
var optionsInfo = eval("("+xmlHttp.responseText+")");
除非你保證 responseText 裡沒有任何雙引號, 否則這行執行時問題會很大
理論上, 應該用
eval(xmlHttp.responseText);
這樣就可以了
francois 2008/6/28 下午 03:56:00
var optionsInfo = eval("("+xmlHttp.responseText+")");
在firefox浏览器下没有问题,但是在ie中提示说“缺少标识符、字符串或数字”。
手册中是如下提示:
需要标识符、字符串或者数字
使用了不正确的文字语法来声明对象文字。对象文字的属性必须是标识符、字符串或一个数。对象文字(也称为“对象初始化程序”)由用逗号分割的属性:值对组成,所有值对都用括号括起来。例如:
var point = {x:1.2, y:-3.4};
要改正此错误
* 请确保使用了正确的文字语法。
请问如何解决啊?
francois 2008/6/28 下午 03:56:00
var optionsInfo = eval("("+xmlHttp.responseText+")");
在firefox浏览器下没有问题,但是在ie中提示说“缺少标识符、字符串或数字”。
手册中是如下提示:
需要标识符、字符串或者数字
使用了不正确的文字语法来声明对象文字。对象文字的属性必须是标识符、字符串或一个数。对象文字(也称为“对象初始化程序”)由用逗号分割的属性:值对组成,所有值对都用括号括起来。例如:
var point = {x:1.2, y:-3.4};
要改正此错误
* 请确保使用了正确的文字语法。
请问如何解决啊?
卜維丰 2008/5/20 下午 10:20:00
那要看你 xmlHttp.responseText 是什麼內容了, 這沒法回答你
wodemima 2008/5/20 下午 05:53:00
哪位大哥帮我解决一下
eval("("+xmlHttp.responseText+")")说是对少"/".
卜維丰 2008/4/10 上午 03:27:00
Jim,
這是 Javascript 浮點運算的 BUG
基本上嘛.......呃
要解的話,兩種方法
用 num.toFixed(#)
num 是計算結果, # 是數字
這是保留幾位小數的意思
要不然咧,就要自己重寫浮點運算
簡單講個原理,就是把小數變成整數(看要乘以10的幾次方), 處理完後, 再除以10的幾次方
Jim 2008/4/9 下午 04:52:00
維丰大 您好.
請教您,我使用eval這個函式,卻發生計算錯誤的情形,請問有何方式可解決,謝謝.
譬如:底下demo網頁,是一個兩個相加的小表單.
我輸入兩個值分別為935.17與768.76.但結果居然不是1703.93=而是很多小數點後數,請問怎麼處理呢 謝謝.
http://superior999.myweb.hinet.net/00.htm
RC 2007/12/19 上午 01:05:00
真是不錯的教學~~
johnny 2007/11/5 上午 10:03:00
講的真詳細,感恩
IVAN 2007/8/23 下午 04:26:00
恩恩…好一個eval()的用法,
真的很不賴用!
謝謝卜大的分享及教學!^^
![]()