主頁 > 知識庫 > asp.net中eval不能定義變量的問題的解決方法

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

熱門標(biāo)簽:電銷業(yè)務(wù) 網(wǎng)站排名優(yōu)化 國美全國運營中心 人工智能 客戶服務(wù) 電商新玩法 百度AI接口 科大訊飛語音識別系統(tǒng)
復(fù)制代碼 代碼如下:

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>
運行結(jié)果:
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;in;i++)
{
FLD= "F0"+((i10)?("00"):((i100)?("0"):("")))+i;
TAB[FLD]=i+1000;
}
for(var i=0;in;i++)
{
FLD= "F0"+((i10)?("00"):((i100)?("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)建的應(yī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)了新的天地。

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

快速模式

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

· 必須聲明所有變量。

· 函數(shù)變?yōu)槌?shù)。

· 內(nèi)部對象不能有 expando 屬性。

· 不能列出或更改內(nèi)部對象的屬性。

· arguments 對象不可用。

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

· eval 方法不能在封閉范圍內(nèi)定義標(biāo)識符。

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

必須聲明所有變量

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

快速模式要求顯示聲明變量。這有助于避免出現(xiàn)前面提到的各種錯誤,并可產(chǎn)生運行得更快的代碼。

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

有關(guān)更多信息,請參見 JScript 變量和常數(shù)。

函數(shù)變?yōu)槌?shù)

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

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

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

內(nèi)部對象不能有 expando 屬性

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

在快速模式中,這是不允許的。如果您的腳本使用了此功能,則必須修改腳本??梢栽谌址秶鷥?nèi)定義函數(shù),而不是將那些函數(shù)作為方法附加到對象上。然后,重寫腳本中的每個實例(在該腳本中 expando 方法是從對象中調(diào)用的),以便將對象傳遞給適當(dāng)?shù)暮瘮?shù)。

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

不能列出或更改內(nèi)部對象的屬性

在以前的 JScript 版本中,可以對內(nèi)部對象的預(yù)定義屬性進(jìn)行刪除、枚舉或?qū)懭搿@?,此種行為可用于更改 Date 對象的默認(rèn) toString 方法。

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

arguments 對象不可用

先前的 JScript 版本在函數(shù)定義中提供了一個 arguments 對象,該對象允許函數(shù)接受任意個參數(shù)。該參數(shù)對象還可以引用當(dāng)前函數(shù)和調(diào)用函數(shù)。

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

在快速模式中沒有辦法直接訪問和引用當(dāng)前函數(shù)或調(diào)用函數(shù)。

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

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

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

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

eval 方法不能在封閉范圍內(nèi)定義標(biāo)識符

在先前的 JScript 版本中,函數(shù)和變量可以通過調(diào)用 eval 方法在本地或全局范圍內(nèi)定義。

在快速模式中,函數(shù)和變量可以在對 eval 方法的調(diào)用中定義,但只能從這個特定的調(diào)用中對它們進(jìn)行訪問。一旦完成 eval 后,在 eval 內(nèi)定義的函數(shù)和變量就不能再行訪問。在 eval 內(nèi)計算所得的結(jié)果可以賦給當(dāng)前范圍內(nèi)可訪問的任何變量。對 eval 方法的調(diào)用很慢,應(yīng)考慮重寫包含這些調(diào)用的代碼。

當(dāng)關(guān)閉快速模式時,可恢復(fù) eval 方法的先前行為。

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

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

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

當(dāng) eval 的第二個參數(shù)為字符串“unsafe”時,傳遞給 eval 方法的代碼在調(diào)用代碼所在的安全上下文中執(zhí)行。這樣,可以還原 eval 方法以前的行為。

安全說明:

以非安全模式使用 eval 只能執(zhí)行從已知源獲得的代碼字符串

標(biāo)簽:攀枝花 廈門 棗莊 咸寧 南平 POS機 益陽 拉薩

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《asp.net中eval不能定義變量的問題的解決方法》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266