程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> ASP.NET基礎 >> asp.net中eval不能定義變量的問題的解決方法

asp.net中eval不能定義變量的問題的解決方法

編輯:ASP.NET基礎
復制代碼 代碼如下:
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>
第三行出現語法錯誤!
可以通過對一個空對象動態加屬性的方法,解決按表字段來定義變量的問題:
表名: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/>");
}
%>

微軟官方網站上對Jscript8.0的說明:

http://msdn.microsoft.com/zh-cn/library/8e4z2w8w(v=vs.90).aspx#jsconupgradingapplicationcreatedinpreviousversionsofjscriptanchor7

升級先前的 JScript 版本中創建的應用程序

Visual Studio 2008

其他版本

·Visual Studio 2010

·Visual Studio 2005

此主題尚未評級 - 評價此主題

更新:2007 年 11 月

大多數現有的 JScript 代碼都可以很好地使用 JScript 8.0 中包含的增強功能,因為對於以前的版本,JScript 8.0 幾乎是完全向後兼容的。JScript 8.0 的新功能開創了新的天地。

默認情況下,JScript 8.0 程序是在快速模式 中編譯的。由於快速模式對所允許的代碼類型有一些限制,因此程序可能會更有效並執行得更快。但是,以前版本中可用的一些功能在快速模式下不可用。這些功能大部分與多線程應用程序不兼容,並會使代碼效率低下。對於用命令行編譯器編譯的程序,可以關閉快速模式,而利用完全的向後兼容性。注意,用這種方法編譯的代碼運行得較慢,容錯性也較差。在 ASP.NET 應用程序中不能關閉快速模式,因為會出現穩定性問題。有關更多信息,請參見 /fast。

快速模式

在快速模式中,會觸發以下 JScript 行為:

· 必須聲明所有變量。

· 函數變為常數。

· 內部對象不能有 expando 屬性。

· 不能列出或更改內部對象的屬性。

· arguments 對象不可用。

· 不能給只讀變量、字段或方法賦值。

· eval 方法不能在封閉范圍內定義標識符。

· eval 方法在受限安全上下文中執行腳本。

必須聲明所有變量

先前的 JScript 版本不要求顯式聲明變量。盡管此功能使程序員節省了擊鍵次數,但它也使跟蹤錯誤變得困難。例如,您可能賦值給拼寫錯誤的變量名,這將既不生成錯誤也不會返回需要的結果。而且,未聲明的變量具有全局范圍,還會引起其他混淆。

快速模式要求顯示聲明變量。這有助於避免出現前面提到的各種錯誤,並可產生運行得更快的代碼。

JScript .NET 還支持經過類型批注的變量。這樣就將每個變量與特定的數據類型綁定在一起,該變量只能存儲那種類型的數據。盡管類型批注不是必須的,但使用它有助於避免與在變量中意外存儲錯誤數據相關的那些錯誤,並可提高程序執行的速度。

有關更多信息,請參見 JScript 變量和常數。

函數變為常數

在以前的 JScript 版本中,用 function 語句聲明的函數與保存 Function 對象的變量被同等對待。特別是,任何函數標識符都可用作變量,來存儲任何類型的數據。

在快速模式中,函數變成了常數。因此,不能為函數賦新值或重新定義函數。這樣可避免意外更改函數的意義。

如果您的腳本需要使函數發生更改,則可以顯式使用某個變量以保存 Function 對象的實例。但是請注意,Function 對象運緩慢。有關更多信息,請參見 Function 對象。

內部對象不能有 expando 屬性

在先前的 JScript 版本中,可以為內部對象添加 expando 屬性。例如,此行為可用於為 String 對象添加方法以剪裁字符串前面的空格。

在快速模式中,這是不允許的。如果您的腳本使用了此功能,則必須修改腳本。可以在全局范圍內定義函數,而不是將那些函數作為方法附加到對象上。然後,重寫腳本中的每個實例(在該腳本中 expando 方法是從對象中調用的),以便將對象傳遞給適當的函數。

此規則的一個重要例外是 Global 對象,它仍然可具有 expando 屬性。全局范圍內的所有修飾符實際上都是 Global 對象的屬性。顯然,Global 對象必須能動態擴展以支持添加新的全局變量。

不能列出或更改內部對象的屬性

在以前的 JScript 版本中,可以對內部對象的預定義屬性進行刪除、枚舉或寫入。例如,此種行為可用於更改 Date 對象的默認 toString 方法。

在快速模式中,這是不允許的。由於內部對象不能具有 expando 屬性,因此不再需要此功能,而每個對象的屬性則列在參考部分。有關更多信息,請參見對象。

arguments 對象不可用

先前的 JScript 版本在函數定義中提供了一個 arguments 對象,該對象允許函數接受任意個參數。該參數對象還可以引用當前函數和調用函數。

在快速模式中,arguments 對象不可用。但是,JScript 8.0 允許進行函數聲明以便在函數參數列表中指定一個參數數組。這就允許函數接受任意多個參數,從而取代了 arguments 對象的部分功能。有關更多信息,請參見 function 語句。

在快速模式中沒有辦法直接訪問和引用當前函數或調用函數。

不能給只讀變量、字段或方法賦值

在先前的 JScript 版本中,語句似乎可以為只讀標識符賦值。這種賦值將無提示地失敗,而發現賦值失敗的唯一方法是測試值是否實際發生了更改。為只讀標識符賦值通常是某種差錯引起的,因為它不會有任何效果。

在快速模式中,如果試圖為只讀標識符賦值,將生成編譯時錯誤。要麼可以移除該賦值,要麼可以嘗試為非只讀的標識符賦值。

如果關閉快速模式,為只讀標識符賦值將在運行時無提示地失敗,但是會生成一個編譯時警告。

eval 方法不能在封閉范圍內定義標識符

在先前的 JScript 版本中,函數和變量可以通過調用 eval 方法在本地或全局范圍內定義。

在快速模式中,函數和變量可以在對 eval 方法的調用中定義,但只能從這個特定的調用中對它們進行訪問。一旦完成 eval 後,在 eval 內定義的函數和變量就不能再行訪問。在 eval 內計算所得的結果可以賦給當前范圍內可訪問的任何變量。對 eval 方法的調用很慢,應考慮重寫包含這些調用的代碼。

當關閉快速模式時,可恢復 eval 方法的先前行為。

eval 方法在受限安全上下文中執行腳本

在以前版本的 JScript 中,傳遞至 eval 方法的代碼將與調用代碼在同一安全上下文中運行。

為了保護用戶,傳遞至 eval 方法的代碼會在受限安全上下文中執行,除非將字符串“unsafe”作為第二個參數傳遞。受限安全上下文禁止訪問系統資源,如文件系統、網絡或用戶界面。如果代碼試圖訪問這些資源,則會產生安全異常。

當 eval 的第二個參數為字符串“unsafe”時,傳遞給 eval 方法的代碼在調用代碼所在的安全上下文中執行。這樣,可以還原 eval 方法以前的行為。

安全說明:

以非安全模式使用 eval 只能執行從已知源獲得的代碼字符串
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved