asp.net中eval不能定義變數的問題的解決方案_實用技巧

來源:互聯網
上載者:User
複製代碼 代碼如下:

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>
第三行出現語法錯誤!
可以通過對一個Null 物件動態加屬性的方法,解決按表欄位來定義變數的問題:
表名: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 只能執行從已知源獲得的代碼字串

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.