JavaScript Diary

Netscape(4.x) の関数は特殊 [ 2001/06/15 ]

あるクラスを IE で作成。NN4.73(以下NN) で確認した結果、意味不明のエラーが発生。苦戦30分。 そこだけ抜粋すると以下のようなプログラムである。

function MyClass( size ){
    this.position = size/MyClass.size ;
}

MyClass.size = 5 ; // クラス変数 size

var object = new MyClass( 10 );

alert( object.position );

これを実行すると、アラートには 2 が表示されるはずですが、NN での結果は 1。
NN では何が違うのかというと、MyClassコンストラクタ関数内の MyClass.size の値です。
IE(NS6)ではクラスメンバの 5 を参照するわけですが、NN はコンストラクタの第一引数 size の値を参照してしまいます(あー恐ろしや)。
これはNNの仕様ですが、このブラウザ間の解釈の違いにより見つけ難いエラーを発生させることになるので注意しましょう。

ところでこれとは関係ないですが(長いプロセスが・・・)、このミスによりちょっとしたことを思い付きました。

function f(){
    alert(arguments.caller.callee.arguments[0]);
}

function g(a){
    f();
}

g(9);

これを実行するとアラートには 9 が表示されます。要は呼び出し元の引数の値を取り出すというものです。
理解しにくいかも知れないですが、頑張って理解して下さい(ただし、これをどう役立てるかは不明。笑)。

話を戻しますが、NNでは引数を参照します。 関数の実装が全然違うということが分かりましたが、これについては調べる必要がありそうです。