ひらい ぶらり Hi-Library

ぷろぐらみんぐについて。ときどきどうでもいいことについて。

クロージャについて3

 クロージャについてって言っておいて、肝心のクロージャについて触れてなかったので書きます。
 クロージャとは・・・・・・リーフってください。っていうと丸投げすぎるので、なんとなくしかわかってないですけど一生懸命自分なりの解釈を書きたいと思います。
 基本的にはスコープの話で、JavaScriptでいきなり

<script type="text/javascript">
    var hoge = "ababa";
    alert(hoge);
    function abeshi() {
        alert(hoge);
    }
    abeshi();
</script>

 と書くと、このhogeはどの関数からでも見ることができるわけですよね。
 つまり二回「ababa」と表示される。
 逆にこの「hoge」が何かの関数内で記述された場合は、その関数内でしか見ることが出来ない。

<script type="text/javascript">
    function abeshi() {
        var hoge = "ababa";
        alert(hoge);
    }
    abeshi();
</script>

 コレは1「ababa」が表示される。

    function abeshi() {
        var hoge = "ababa";
    }
    abeshi();
    alert(hoge);

 コレは「undifined」とかってなるわけですね。
 そんなのわかってるよ、って話ですよね。

 で、何かしらのライブラリのようなものを作る場合は最初のようにグローバルな変数として定義してしまうと、変数名がかぶったりしてエラーが起きてしまう。それはライブラリとして致命的ではないか、というお話です。

 じゃぁどうすんのか、と。
 プログラム全体をロードされたときに一度だけ実行される関数として書いてやればいいわけですね。
 そうすると「window.load = function(){...}」とかやりたくなりますが、これは美味しくない。既にwindow.loadが利用されていると、上書きしてしまう形になって、本来window.loadで処理されるはずの関数が実行されなくなってしまう。
 
 で、これらを回避するプログラムが以下のような感じ、だと思います。

(function(){...})();

 こんな感じで実行してやれば、無名関数として実行されるので、変数はこのfunction内でしか有効ではないので変数はかぶらない。ロードされた瞬間に実行される。

 もしwindow.loadを使わなければいけない場合は

(function(){
    var tmp_load = window.load;
    function my_load() {
        tmp_load();
        ....
    }
    window.load = my_load;
})();

 見たいな感じにしてやれば、元のwindow.loadを実行してから自分の処理を実行することができるんじゃなかろーか。多分。
 こんな感じでいいんでしょうか><!?
 gessy先生とtell_k先生の赤ペン先生をお待ちしております。