asp.Netでevalが変数を定義できない問題の解決方法
5839 ワード
eval.asp
<br>eval("var f1=1,f2=2,f3=3;");
<br>Response.Write(f1+"<br/>");
<br>Response.Write(f2+"<br/>");
<br>Response.Write(f3+"<br/>");
<br>
:
1
2
3
eval01.aspx
<br>eval("var f1=1,f2=2,f3=3;");
<br>Response.Write(f1+"<br/>");
<br>Response.Write(f2+"<br/>");
<br>Response.Write(f3+"<br/>");
<br>
!
, :
: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);
var TAB={
};
var n=12;
var FLD;
for(var i=0;i{
FLD= "F0"+((i<10)?("00"):((i<100)?("0"):("")))+i;
TAB[FLD]=i+1000;
}
for(var i=0;i{
FLD= "F0"+((i<10)?("00"):((i<100)?("0"):("")))+i;
Response.Write(TAB[FLD]+"
");
}
%>
マイクロソフトの公式サイトでJscript 8.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メソッドはオブジェクトから呼び出されます)を書き換えて、オブジェクトを適切な関数に渡します.
このルールの重要な例外の1つは、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」を2番目のパラメータとして渡さない限り、制限されたセキュリティコンテキストで実行されます.制限されたセキュリティコンテキストでは、ファイルシステム、ネットワーク、またはユーザーインタフェースなどのシステムリソースへのアクセスが禁止されています.コードがこれらのリソースにアクセスしようとすると、セキュリティ例外が発生します.
evalの2番目のパラメータが文字列「unsafe」である場合、evalメソッドに渡されるコードは、呼び出しコードが存在するセキュリティコンテキストで実行されます.これにより,eval法以前の挙動を復元することができる.
セキュリティの説明:
非セキュアモードでevalを使用すると、既知のソースから取得されたコード文字列のみが実行されます.