Java Applet で JavaScript コードを実行する

import java.applet.Applet;
import netscape.javascript.JSObject;
 
public class jstest extends Applet{
public void start(){
JSObject js = JSObject.getWindow(this);
js.eval(“alert(‘Hello, world!!’)”);
}
}

JavaScript を Java Applet にしてサイズ圧縮をうたい文句にしているソフトより。これなら JavaScript 上で Zip 圧縮/解凍して eval したほうがいい(jar って zip だし、肝心の JavaScript は Java コードのリテラルなので *.class に生で書かれているし)。

ブラウザの JavaScript バージョンチェック

<http://members.at.infoseek.co.jp/sig1/jscript/js-vercheck.html>
– JavaScript バージョンチェック

<SCRIPT LANGUAGE=”JavaScript1.0″><!–
j=”1.0″;
–></SCRIPT>
 .. snip ..
<SCRIPT LANGUAGE=”JavaScript2.0″><!–
j=”2.0″;
//–></SCRIPT>
.. snip ..
<SCRIPT LANGUAGE=”JavaScript1.0″><!–
document.write(“Javascript “+j+” に対応しています。”);
//–></SCRIPT>

というように, <script> の language 属性を使って判別してる。このサイトでは LiveScript, VBScript もチェック対象としているが、VBScript のチェックを JavaScript の文で行おうとしてエラーになっている。IE6 は JavaScript 1.3, Firefox1.0(Gecko/20050318) は JavaScript 1.5 までに対応していた。

[JavaScript][ActionScript] ブロック({ … }) ではスコープの限定ができない

一時変数のスコープを絞るのに { … } をよく使うが、ECMAScript (ActionScript/JavaScript 共通) だと物理的には意味をなさなくなる。例えば、次の文はエラーにはならない:

{var t=”NG”;} alert(t);

ブロックがスコープを持つなら、t は alert() を呼ぶ時点では存在しないためエラーになるべきだが、実際は NG と表示されてしまう。(Firefox 1.0, IE6, Flash MX 2004 で確認)
 
これは制御構文でも同じで、例えば、

for(var i; i < 10; i++){ var n = i; }

は、for 文の終了後に

i = 10; n = 9;

が入ったままになる。スコープを切りたい場合は、その部分だけ関数を使う等するしかなさそう。個人的に、リファクタリングの準備のために頻繁にスコープを切るのでこれは不便だなぁ..
ECMAScript では関数スコープであることを宣言するときのみ var 宣言は意味を成しているよう。