前のバージョンの JScript で作成されたアプリケーションのアップグレード

更新 : 2007 年 11 月

既存の JScript コードのほとんどは、さまざまな点が強化された JScript 8.0 でも適切に動作します。JScript 8.0 は、前のバージョンの JScript に対してほとんど完全な下位互換性を持ちます。JScript 8.0 の新しい機能は、新しい領域を拡張しています。

既定では、JScript 8.0 プログラムは "高速モード" でコンパイルされます。高速モードではコードにいくつかの制限があるため、プログラムはより効率的になり、実行速度が速くなります。ただし、以前のバージョンで利用できた機能の一部は、高速モードでは利用できません。ほとんどの場合、これらの機能はマルチスレッド アプリケーションと互換性がなく、非効率的なコードを生成します。コマンド ライン コンパイラでコンパイルされるプログラムの場合は、高速モードをオフにして、下位互換性を完全に維持できます。このようにしてコンパイルされたコードは処理速度が遅く、エラーが発生しやすくなります。ASP.NET アプリケーションでは、安定性の問題があるため、高速モードをオフにできません。詳細については、「/fast」を参照してください。

高速モード

高速モードでは、JScript は次のように動作します。

  • すべての変数を宣言する必要があります。

  • 関数は定数になります。

  • 組み込みオブジェクトに拡張プロパティは指定できません。

  • 組み込みオブジェクトでは、プロパティを一覧で示したり変更したりできません。

  • 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 オブジェクトは、呼び出し元の関数だけでなく、現在の関数への参照も提供しました。

高速モードでは、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 メソッドの以前の動作が復元されます。

8e4z2w8w.alert_security(ja-jp,VS.90).gifセキュリティに関するメモ :

eval は、既知のソースから取得したコード文字列を実行する場合だけ、unsafe モードで使用してください。

参照

概念

JScript 8.0 の概要 (JScript プログラマ対象)

参照

/fast

その他の技術情報

JScript について