JScript.NETとは違い、WSHのJScriptでは変数定義を強制できない。
そこで、変数宣言の静的チェックを行うため、JScript.NETコンパイラを利用する。
なお、ソースファイルのエンコードは「Unicode(UTF16) BOMなし」「UTF7 BOMなし」を避けること。
これらの文字コードのファイルはコンパイルエラーとなる。
以下はサンプルソース。変数 i が宣言されていない。
// sample.js var a = [4, 5, 6]; for(i = 0; i < a.length; i++) { WScript.Echo(a[i]); }
次はコンパイル・コマンドの例。jsc.exeがコンパイラの実行ファイルの名前
"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\jsc.exe" sample.js
コンパイル結果
C:\tmp>"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\jsc.exe" sample.js Microsoft(R) JScript Compiler version 14.00.4084 for Microsoft(R) .NET Framework version 4.0.30319 Copyright (C) Microsoft Corporation. All rights reserved. sample.js(3,5) : error JS1135: 変数 'i' が宣言されていません。 sample.js(4,5) : error JS1135: 変数 'WScript' が宣言されていません。 C:\tmp>
WScriptオブジェクトはWSHのJScriptで使えるがJScript.NETでは使えない。次のエラーが出る。
error JS1135: 変数 'WScript' が宣言されていません。
とりあえず、ダミーで最初の行に宣言する。
// sample.js var WScript; var a = [4, 5, 6]; for(i = 0; i < a.length; i++) { WScript.Echo(a[i]); }
C:\tmp>"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\jsc.exe" sample.js Microsoft(R) JScript Compiler version 14.00.4084 for Microsoft(R) .NET Framework version 4.0.30319 Copyright (C) Microsoft Corporation. All rights reserved. sample.js(4,5) : error JS1135: 変数 'i' が宣言されていません。 C:\tmp>
元のWSHスクリプトには手を入れないよう対処することもできる。
次のファイル vars.js を用意する。
// vars.js var WScript;
次のようなコマンドでコンパイルする。
"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\jsc.exe" /out:sample.exe vars.js sample.js
以上のように静的チェックができる。
当然ながら出来たEXEファイルは実行してもエラーが出る。