以下為本站文章分類清單

  1. AJAXspacer
  2. ASPspacer
  3. CSSspacer
  4. Javascriptspacer
  5. Windows 應用程式spacer
  6. 網頁設計
  7. 評論、短文、雜文spacer
  8. 版主spacer
  9. 最新回應spacer

以下為本頁本文內容

Javascript 的eval()語法

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() 是把一串字串,當作指令來執行,並得出結果,實作時,在訂單處理上應用較廣,例如以下是份簡單訂單:

數量 單價 小計
Q1 P1 T1
Q2 P2 T2
Q3 P3 T3

很基本的訂單,欄位後是欄位名稱,我想大多數設計師,都會像這個例子,用編號來進行不同筆數訂單欄位命名,而不是每個欄位獨立命名,顯示,在輸入數量及單價後,小計要能自動計算,也就是:

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('form.T'+i+'.value=form.Q'+i+'.value(form.P'+i+'.value');

}

把 eval() 裡的字串,i 的值分別用 1,2,3 套入,結果和前面寫一大串三行的效果一模一樣。

不錯用吧!

 

卜維丰 4/11 07'

以下為文章回應區

同意轉載,不過麻煩看一下轉載需知

老蕭   2011/9/7 上午 09:41:00

我解決我的問題了 ~ ^^ 感謝資訊分享

老蕭   2011/9/6 下午 07:17:00

卜老師 我看到我的疑問了

請問我剛的程式
Picselect(S001) <== 因為 是字串的關係無法處理嗎??
需要如何才能讓他處理呢??

老蕭   2011/9/6 下午 06:55:00

卜老師 請教一個程式設計上的問題

假設

網頁上有一圖片
onclick="javascript:Picselect(s001)"

<script LANGUAGE="JavaScript">
function Picselect(picN)
{
eval("alert("+ picN+")")

// 此行OK 表示有Run到此 document.form1.s001.value = 1
}

</script>
我實在不懂為什麼在這邊 程式會看不懂
"picN"為何物


TINA   2011/9/2 下午 03:34:00

我也懂了 XD

QOO   2010/1/14 下午 03:43:00

講的真不錯。

chiyaki   2009/12/23 上午 11:00:00

啊啊~我懂了
簡言之是 字串與變數混合運用
可以把我下面的留言刪掉嗎
感謝

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()的用法,
真的很不賴用!
謝謝卜大的分享及教學!^^

給個回應
姓名:
佈落格網址:
  如果您是要發問問題, 最好有個問題測試的網址, 這樣比較容易找到您問題所在, 謝謝
內容: