読者です 読者をやめる 読者になる 読者になる

Pebble's Diary

プログラマーの作業メモ

JavaScript 関数リテラルをその場で呼び出す

JavaScript

無名関数リテラルをその場で呼び出すというJavaScriptイディオムがあります。 性質を見てみます。

(function () {
    function hoge() {
        print( "fuga" );
    }
    hoge(); // fuga 
})();
hoge(); // typein:25: ReferenceError: hoge is not defined

関数内で宣言された関数は関数スコープです。さらに無名であり、変数にも代入されていないので、外側から呼び出す方法はありません。このイディオムはC++のクラスでいうprivate属性と似た性質も持ちます。

変数に代入したオブジェクトも関数スコープなので結果は同じです。

(function () {
    var human = {
        walk: function() {
            print( "tekuteku" );
        }
    };
})();
human.walk(); // typein:49: ReferenceError: human is not defined