http://bbs.wankuma.com/index.cgi?mode=one&namber=7546&type=7497&space=120 より
魔界の仮面弁士さんが丁寧に答えてくれているサンプルなのだけど、このサンプル見て
ちょっとイタズラしてみようと考えた。
まずは、これ。
<?xml version="1.0" encoding="Shift_JIS"?>
<?component error="true" debug="true"?>
<package>
<job id="sample">
<script language="VBScript">
option explicit
Dim Mes
Mes = "最初"
msgbox Mes
</script>
<script language="VBScript">
Mes1 = "最後"
msgbox Mes1
</script>
</job>
</package>
これはエラーにならない。
Scriptタグごと(以下、ブロックとここでは書きます。)に、Option Explicitをわけて認識していて、
後半のブロックでMes1は定義されてない、Explicit offの状態のようだ。
で、これをこうしてみる。
<?xml version="1.0" encoding="Shift_JIS"?>
<?component error="true" debug="true"?>
<package>
<job id="sample">
<script language="VBScript">
option explicit
Mes = "最初"
msgbox Mes
</script>
<script language="VBScript">
option explicit
Dim Mes
Mes = "最後"
msgbox Mes
</script>
</job>
</package>
これは、先ほどの結果から判断して、当然エラーになる。最初のブロックでMesを宣言してないからだ。
しかし、
<?xml version="1.0" encoding="Shift_JIS"?>
<?component error="true" debug="true"?>
<package>
<job id="sample">
<script language="VBScript">
option explicit
Dim Mes
Mes = "最初"
</script>
<script language="VBScript">
option explicit
msgbox Mes
Dim Mes
Mes = "最後"
msgbox Mes
</script>
</job>
</package>
こんなのもエラーにならない。Mesは2重定義になるのかと思ったが、無視しているのか、ブロックごとに見ているのか。
Mesは値をきちんと引き継いでくれるところをみると、無視しているような感じだ。
はては、
<?xml version="1.0" encoding="Shift_JIS"?>
<?component error="true" debug="true"?>
<package>
<job id="sample">
<script language="VBScript">
option explicit
Dim Mes
</script>
<script language="VBScript">
option explicit
Mes = "最初"
</script>
<script language="VBScript">
option explicit
msgbox Mes
Mes = "最後"
msgbox Mes
</script>
</job>
</package>
これだって、エラーにならない。ブロックごとに分けて認識しているような動きもするけど、
かなり好意的に見てくれるようだ。
まあ、Option Explicitが、同一のScriptブロック内に複数あるとエラーになるし、
当然ながら、Option Explicitをこんな風に入れてもエラーになる。
<script language="VBScript">
Dim Mes
Mes = "最初"
option explicit
</script>
<script language="VBScript">
option explicit
Dim Mes
Mes = "最後"
msgbox Mes
</script>
結論:スクリプトエンジン、かしこいな。適当に書いても好意的に解釈するのね。>今更なんだけどね。