JavaScript Diary

これはバグだろう [ 2001/06/13 ]
JavaScript1.2 から関数の入れ子が許されるようになった。どこでも関数を定義できるようになり、非常に柔軟なスクリプトを書けるようになったわけだけど、NS4.73 にバグ(?)が見つかったので書いておく(IE5.01,NS6は正常に動作)。
function Class(){ this.prop ; }

function setMember(){
    
    Class.prototype.method = function(){
        
        return inner();
        
        function inner(){ return "sample" ; }
        
    };
    
} setMember();

alert( new Class().method() );
バッティングを極力減らすため、僕はこのように関数内(setMember)でメンバを追加するようにしている。リテラル形式の関数が静的であることを考えると当然アラートには sample の文字が表示されるはずであるが、NS4.73 の場合、エラーにもならず、アラートにも何も表示されない。
この現象が起きるのはごく限られた場合で、関数内(setMember)で、クラスに prototype し、さらにその中に関数(inner)を定義し、その関数を行的に定義される前に呼び出した場合である。行的というのはつまり、以下のようにすれば解消される。
function Class(){ this.prop ; }

function setMember(){
    
    Class.prototype.method = function(){
        
        function inner(){ return "sample" ; }
        
        return inner();
        
    };
    
} setMember();

alert( new Class().method() );
また、↓のようにグローバルな位置で追加すれば正常に動作することも付け加えておく。
function Class(){ this.prop ; }

Class.prototype.method = function(){
    
    function inner(){ return "sample" ; }
    
    return inner();
    
};

alert( new Class().method() );