- 时间:2021-07-19 21:05 编辑: 来源: 阅读:
- 扫一扫,手机访问
摘要:asp.net中eval不能定义变量的问题的解决方法
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。
[b]快速模式[/b]
在快速模式中,会触发以下 JScript 行为:
· 必须声明所有变量。
· 函数变为常数。
· 内部对象不能有 expando 属性。
· 不能列出或更改内部对象的属性。
· arguments 对象不可用。
· 不能给只读变量、字段或方法赋值。
· eval 方法不能在封闭范围内定义标识符。
· eval 方法在受限安全上下文中执行脚本。
[b]必须声明所有变量[/b]
先前的 JScript 版本不要求显式声明变量。尽管此功能使程序员节省了击键次数,但它也使跟踪错误变得困难。例如,您可能赋值给拼写错误的变量名,这将既不生成错误也不会返回需要的结果。而且,未声明的变量具有全局范围,还会引起其他混淆。
快速模式要求显示声明变量。这有助于避免出现前面提到的各种错误,并可产生运行得更快的代码。
JScript .NET 还支持经过类型批注的变量。这样就将每个变量与特定的数据类型绑定在一起,该变量只能存储那种类型的数据。尽管类型批注不是必须的,但使用它有助于避免与在变量中意外存储错误数据相关的那些错误,并可提高程序执行的速度。
有关更多信息,请参见 JScript 变量和常数。
[b]函数变为常数
[/b]
在以前的 JScript 版本中,用 function 语句声明的函数与保存 Function 对象的变量被同等对待。特别是,任何函数标识符都可用作变量,来存储任何类型的数据。
在快速模式中,函数变成了常数。因此,不能为函数赋新值或重新定义函数。这样可避免意外更改函数的意义。
如果您的脚本需要使函数发生更改,则可以显式使用某个变量以保存 Function 对象的实例。但是请注意,Function 对象运缓慢。有关更多信息,请参见 Function 对象。
[b]内部对象不能有 expando 属性[/b]
在先前的 JScript 版本中,可以为内部对象添加 expando 属性。例如,此行为可用于为 String 对象添加方法以剪裁字符串前面的空格。
在快速模式中,这是不允许的。如果您的脚本使用了此功能,则必须修改脚本。可以在全局范围内定义函数,而不是将那些函数作为方法附加到对象上。然后,重写脚本中的每个实例(在该脚本中 expando 方法是从对象中调用的),以便将对象传递给适当的函数。
此规则的一个重要例外是 Global 对象,它仍然可具有 expando 属性。全局范围内的所有修饰符实际上都是 Global 对象的属性。显然,Global 对象必须能动态扩展以支持添加新的全局变量。
[b]不能列出或更改内部对象的属性[/b]
在以前的 JScript 版本中,可以对内部对象的预定义属性进行删除、枚举或写入。例如,此种行为可用于更改 Date 对象的默认 toString 方法。
在快速模式中,这是不允许的。由于内部对象不能具有 expando 属性,因此不再需要此功能,而每个对象的属性则列在参考部分。有关更多信息,请参见对象。
[b]arguments 对象不可用[/b]
先前的 JScript 版本在函数定义中提供了一个 arguments 对象,该对象允许函数接受任意个参数。该参数对象还可以引用当前函数和调用函数。
在快速模式中,arguments 对象不可用。但是,JScript 8.0 允许进行函数声明以便在函数参数列表中指定一个参数数组。这就允许函数接受任意多个参数,从而取代了 arguments 对象的部分功能。有关更多信息,请参见 function 语句。
在快速模式中没有办法直接访问和引用当前函数或调用函数。
[b]不能给只读变量、字段或方法赋值[/b]
在先前的 JScript 版本中,语句似乎可以为只读标识符赋值。这种赋值将无提示地失败,而发现赋值失败的唯一方法是测试值是否实际发生了更改。为只读标识符赋值通常是某种差错引起的,因为它不会有任何效果。
在快速模式中,如果试图为只读标识符赋值,将生成编译时错误。要么可以移除该赋值,要么可以尝试为非只读的标识符赋值。
如果关闭快速模式,为只读标识符赋值将在运行时无提示地失败,但是会生成一个编译时警告。
[b]eval 方法不能在封闭范围内定义标识符
[/b]
在先前的 JScript 版本中,函数和变量可以通过调用 eval 方法在本地或全局范围内定义。
在快速模式中,函数和变量可以在对 eval 方法的调用中定义,但只能从这个特定的调用中对它们进行访问。一旦完成 eval 后,在 eval 内定义的函数和变量就不能再行访问。在 eval 内计算所得的结果可以赋给当前范围内可访问的任何变量。对 eval 方法的调用很慢,应考虑重写包含这些调用的代码。
当关闭快速模式时,可恢复 eval 方法的先前行为。
[b]eval 方法在受限安全上下文中执行脚本
[/b]在以前版本的 JScript 中,传递至 eval 方法的代码将与调用代码在同一安全上下文中运行。
为了保护用户,传递至 eval 方法的代码会在受限安全上下文中执行,除非将字符串“unsafe”作为第二个参数传递。受限安全上下文禁止访问系统资源,如文件系统、网络或用户界面。如果代码试图访问这些资源,则会产生安全异常。
当 eval 的第二个参数为字符串“unsafe”时,传递给 eval 方法的代码在调用代码所在的安全上下文中执行。这样,可以还原 eval 方法以前的行为。
[b]安全说明:[/b]
以非安全模式使用 eval 只能执行从已知源获得的代码字符串