eval.asp
<%@ LANGUAGE='JAVASCRIPT'%>
<script Language="javascript" runat=server>
eval("var f1=1,f2=2,f3=3;");
Response.Write(f1+"<br/>");
Response.Write(f2+"<br/>");
Response.Write(f3+"<br/>");
</script>
運行結果:
1
2
3
eval01.aspx
<%@ LANGUAGE='JAVASCRIPT' DEBUG="true"%>
<script Language="javascript" runat=server>
eval("var f1=1,f2=2,f3=3;");
Response.Write(f1+"<br/>");
Response.Write(f2+"<br/>");
Response.Write(f3+"<br/>");
</script>
第三行出現(xiàn)語法錯誤!
可以通過對一個空對象動態(tài)加屬性的方法,解決按表字段來定義變量的問題:
表名:T
F1 int,
F2 char(10),
F3 datetime
asp:
eval(“var F1='',F2='',F3='';”);
Response.Write(“F1=”+F1);
aspx:
var T={};
T[“F1”]=””;
T[“F2”]=””;
T[“F3”]=””;
Response.Write(“F1=”+T.F1);
<%@ LANGUAGE='JScript' DEBUG="true"%>
<%
var TAB={
};
var n=12;
var FLD;
for(var i=0;i<n;i++)
{
FLD= "F0"+((i<10)?("00"):((i<100)?("0"):("")))+i;
TAB[FLD]=i+1000;
}
for(var i=0;i<n;i++)
{
FLD= "F0"+((i<10)?("00"):((i<100)?("0"):("")))+i;
Response.Write(TAB[FLD]+"<br/>");
}
%>
微軟官方網(wǎng)站上對Jscript8.0的說明:http://msdn.microsoft.com/zh-cn/library/8e4z2w8w(v=vs.90).aspx#jsconupgradingapplicationcreatedinpreviousversionsofjscriptanchor7
升級先前的 JScript 版本中創(chuàng)建的應用程序
Visual Studio 2008
其他版本
·Visual Studio 2010
·Visual Studio 2005
此主題尚未評級 - 評價此主題
更新:2007 年 11 月
大多數(shù)現(xiàn)有的 JScript 代碼都可以很好地使用 JScript 8.0 中包含的增強功能,因為對于以前的版本,JScript 8.0 幾乎是完全向后兼容的。JScript 8.0 的新功能開創(chuàng)了新的天地。
默認情況下,JScript 8.0 程序是在快速模式 中編譯的。由于快速模式對所允許的代碼類型有一些限制,因此程序可能會更有效并執(zhí)行得更快。但是,以前版本中可用的一些功能在快速模式下不可用。這些功能大部分與多線程應用程序不兼容,并會使代碼效率低下。對于用命令行編譯器編譯的程序,可以關閉快速模式,而利用完全的向后兼容性。注意,用這種方法編譯的代碼運行得較慢,容錯性也較差。在 ASP.NET 應用程序中不能關閉快速模式,因為會出現(xiàn)穩(wěn)定性問題。有關更多信息,請參見 /fast。
快速模式
在快速模式中,會觸發(fā)以下 JScript 行為:
· 必須聲明所有變量。
· 函數(shù)變?yōu)槌?shù)。
· 內部對象不能有 expando 屬性。
· 不能列出或更改內部對象的屬性。
· arguments 對象不可用。
· 不能給只讀變量、字段或方法賦值。
· eval 方法不能在封閉范圍內定義標識符。
· eval 方法在受限安全上下文中執(zhí)行腳本。
必須聲明所有變量
先前的 JScript 版本不要求顯式聲明變量。盡管此功能使程序員節(jié)省了擊鍵次數(shù),但它也使跟蹤錯誤變得困難。例如,您可能賦值給拼寫錯誤的變量名,這將既不生成錯誤也不會返回需要的結果。而且,未聲明的變量具有全局范圍,還會引起其他混淆。
快速模式要求顯示聲明變量。這有助于避免出現(xiàn)前面提到的各種錯誤,并可產生運行得更快的代碼。
JScript .NET 還支持經(jīng)過類型批注的變量。這樣就將每個變量與特定的數(shù)據(jù)類型綁定在一起,該變量只能存儲那種類型的數(shù)據(jù)。盡管類型批注不是必須的,但使用它有助于避免與在變量中意外存儲錯誤數(shù)據(jù)相關的那些錯誤,并可提高程序執(zhí)行的速度。
有關更多信息,請參見 JScript 變量和常數(shù)。
函數(shù)變?yōu)槌?shù)
在以前的 JScript 版本中,用 function 語句聲明的函數(shù)與保存 Function 對象的變量被同等對待。特別是,任何函數(shù)標識符都可用作變量,來存儲任何類型的數(shù)據(jù)。在快速模式中,函數(shù)變成了常數(shù)。因此,不能為函數(shù)賦新值或重新定義函數(shù)。這樣可避免意外更改函數(shù)的意義。
如果您的腳本需要使函數(shù)發(fā)生更改,則可以顯式使用某個變量以保存 Function 對象的實例。但是請注意,F(xiàn)unction 對象運緩慢。有關更多信息,請參見 Function 對象。
內部對象不能有 expando 屬性
在先前的 JScript 版本中,可以為內部對象添加 expando 屬性。例如,此行為可用于為 String 對象添加方法以剪裁字符串前面的空格。
在快速模式中,這是不允許的。如果您的腳本使用了此功能,則必須修改腳本。可以在全局范圍內定義函數(shù),而不是將那些函數(shù)作為方法附加到對象上。然后,重寫腳本中的每個實例(在該腳本中 expando 方法是從對象中調用的),以便將對象傳遞給適當?shù)暮瘮?shù)。
此規(guī)則的一個重要例外是 Global 對象,它仍然可具有 expando 屬性。全局范圍內的所有修飾符實際上都是 Global 對象的屬性。顯然,Global 對象必須能動態(tài)擴展以支持添加新的全局變量。
不能列出或更改內部對象的屬性
在以前的 JScript 版本中,可以對內部對象的預定義屬性進行刪除、枚舉或寫入。例如,此種行為可用于更改 Date 對象的默認 toString 方法。
在快速模式中,這是不允許的。由于內部對象不能具有 expando 屬性,因此不再需要此功能,而每個對象的屬性則列在參考部分。有關更多信息,請參見對象。
arguments 對象不可用
先前的 JScript 版本在函數(shù)定義中提供了一個 arguments 對象,該對象允許函數(shù)接受任意個參數(shù)。該參數(shù)對象還可以引用當前函數(shù)和調用函數(shù)。
在快速模式中,arguments 對象不可用。但是,JScript 8.0 允許進行函數(shù)聲明以便在函數(shù)參數(shù)列表中指定一個參數(shù)數(shù)組。這就允許函數(shù)接受任意多個參數(shù),從而取代了 arguments 對象的部分功能。有關更多信息,請參見 function 語句。
在快速模式中沒有辦法直接訪問和引用當前函數(shù)或調用函數(shù)。
不能給只讀變量、字段或方法賦值
在先前的 JScript 版本中,語句似乎可以為只讀標識符賦值。這種賦值將無提示地失敗,而發(fā)現(xiàn)賦值失敗的唯一方法是測試值是否實際發(fā)生了更改。為只讀標識符賦值通常是某種差錯引起的,因為它不會有任何效果。
在快速模式中,如果試圖為只讀標識符賦值,將生成編譯時錯誤。要么可以移除該賦值,要么可以嘗試為非只讀的標識符賦值。
如果關閉快速模式,為只讀標識符賦值將在運行時無提示地失敗,但是會生成一個編譯時警告。
eval 方法不能在封閉范圍內定義標識符
在先前的 JScript 版本中,函數(shù)和變量可以通過調用 eval 方法在本地或全局范圍內定義。在快速模式中,函數(shù)和變量可以在對 eval 方法的調用中定義,但只能從這個特定的調用中對它們進行訪問。一旦完成 eval 后,在 eval 內定義的函數(shù)和變量就不能再行訪問。在 eval 內計算所得的結果可以賦給當前范圍內可訪問的任何變量。對 eval 方法的調用很慢,應考慮重寫包含這些調用的代碼。
當關閉快速模式時,可恢復 eval 方法的先前行為。
eval 方法在受限安全上下文中執(zhí)行腳本
在以前版本的 JScript 中,傳遞至 eval 方法的代碼將與調用代碼在同一安全上下文中運行。
為了保護用戶,傳遞至 eval 方法的代碼會在受限安全上下文中執(zhí)行,除非將字符串“unsafe”作為第二個參數(shù)傳遞。受限安全上下文禁止訪問系統(tǒng)資源,如文件系統(tǒng)、網(wǎng)絡或用戶界面。如果代碼試圖訪問這些資源,則會產生安全異常。
當 eval 的第二個參數(shù)為字符串“unsafe”時,傳遞給 eval 方法的代碼在調用代碼所在的安全上下文中執(zhí)行。這樣,可以還原 eval 方法以前的行為。
安全說明:
以非安全模式使用 eval 只能執(zhí)行從已知源獲得的代碼字符串
聲明:本網(wǎng)頁內容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com