您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“如何解決asp.net中eval不能定義變量的問題”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
復(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;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)建的應(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í)行從已知源獲得的代碼字符串
“如何解決asp.net中eval不能定義變量的問題”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。