VBS のconstをJSで上書きしてみる
IE8だと上書きの代入でエラーになる。これは理解できる。Strict mode のときの IE10 Release Previewも代入でエラーでこれも理解できる。でも Strict mode では無いときの IE10 Release Preview の動作がよくわからない
<script type="text/vbscript"> a=1 Msgbox a </script> <script type="text/javascript"> function f() { try { alert( JSON.stringify(Object.getOwnPropertyDescriptor(window,"a"))); } catch (e) { alert(window.a) } } f(); //It shows window.a is 1. a=2; //IE8 makes runtime error, but IE10 Release preview accepts this when script is not "strict mode". f(); //It shows window.a is 2 !! </script> <script type="text/vbscript"> Msgbox TypeName(a) & ":" & a 'It is Integer:1 Msgbox TypeName(window.a) & ":" & window.a 'It is Long:2 at IE10 Release preview </script>
2013/01/25 追記
IE10 Release preview で、JavaScriptで定数を上書きした後にVBScript側で a と window.a の値を比較するとwindow.a の変更内容が a に反映されていないことがわかります。VBScript側から見たら a は定数なので変更内容を取り込む処理が省略されているような感じです。
2013/01/25 追記2
strict modeでは、定数の上書きではなく未定義の変数への代入でエラーになるので、JavaScriptからはやはり定数としては見えていないようです