WSHのJScriptでは変数宣言を強制できないので、JScript.NETコンパイラで静的チェックを行う

JScript.NETとは違い、WSHJScriptでは変数定義を強制できない。
そこで、変数宣言の静的チェックを行うため、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オブジェクトはWSHJScriptで使えるが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ファイルは実行してもエラーが出る。