JavaScript Diary

グローバル関数の裏技 [ 2001/06/18 ]
僕が知る限り、JavaScript は変数などを含む全てのオブジェクトが連想配列として表すことができます。例えば、グローバルな位置で宣言された関数でさえも
function f(){ return "sample" ; }

alert( window["f"]() );
とすることができます。勿論、window.f() でも良いです(6月3日分参照)。勘の良い人は気付くでしょうが、これを利用するとすんげーことが出来てしまいます。
function setFunction(){
    
    var voo = "inner" ;
    
    window.innerFunction = function(){ return voo ; };
    
}

setFunction(); // 初期化

var voo = "outer" ;

alert( innerFunction() );

window オブジェクトのプロパティに追加することで、ローカルな位置で宣言したものをグローバルな位置で使用することが出来るわけです。しかも、ここで驚くべきことは変数のスコープです。↑のプログラムを実行すると、アラートに表示されるのは、outer ではなく、inner の文字列です。
ローカル変数を取り込み、実行することができます。これは関数リテラルが静的であることを考えると納得できるかと思います。

これは非常に強力な方法で、何もwindowオブジェクトに限ったことではありません。
ローカル変数のスコープを(仮想的にとでもいいますか)変更することで、他言語では考えられないような特殊なプログラムを作成することができるようになります。
但し、お分かりのように関数内にあるはずのない変数が存在したりと、動的極まりなく複雑、理解不能なプログラムになりがちです。
だからと言って、あまり使用しないように、なんて言いません()。