komorebikoboshiのブログ

プログラミング記事(趣味レベル)が多め。

Javascriptの関数を表示したい

例えば、

function increment(x){
    return x + 1;
}

という関数があったとして、

alert(increment(1) );

は当然2が表示される。で、Javascriptの関数とは普通の変数にFunctionオブジェクトが代入されたものらしいので

alert(increment)

とすることもできる。で、これは

function increment(x){
    return x + 1;
}

と関数の中身が表示される。
でもせっかくだから"increment"とか表示させてみたい。そこで、

function increment(x){
    return x + 1;
}
increment.toString = function(){return "increment";};

とすると

alert(increment(1) ) // => 2
alert(increment) // => increment

というように元の関数の機能を保ったまま表示(文字列化)を変更することができる。
……ただのメソッドのオーバーライドじゃん!
クロージャだと

var makePlus = function(x){
    var ret = function(y){
        return x + y;
    }
    ret.toString = function(){return "Plus" + x;};
    return ret;
}

var x = makePlus(10);

alert(x); // => Plus10
alert(x(5) ); // => 15

var y = makePlus(5);

alert(y); // => Plus5
alert(y(5) ); // => 10

少し楽しい。
で、なんでこんなことをしたのかというと、プログラミング言語Grass
ちょっと草植えときますね型言語 Grass
Javascriptで書いていて、そのデバッグ用にこんなことができたらいいなあと思ったから。完成したらそちらの記事も書いてみたい。