[JavaScript]関数に、一度しか実行しない初期化処理を組み込む

関数に、コンストラクタのような一度しか実行されない初期化処理を組み込むことが出来ます。
下記の例では、getCounter()で関数オブジェクトを取得するたびに、初期化処理がコールされます。

 
// 関数の定義
var getCounter = function() {
    // コンストラクタ的な、初期化処理
    console.log( "initialize" );
 
    // この変数は呼び元から見えない(privateな状態になる)
    var counter = 0;
 
    return function() {
        console.log( "count :" + counter );
        return counter+=1;
    };
};
 
 
// 呼び出しのテスト
var counter = getCounter();     // ここで、"initialize"が表示される。
alert( counter() );
alert( counter() );
 
var counter = getCounter();     // ここで、"initialize"が表示される。
alert( counter() );
alert( counter() );



consoleの出力結果

initialize
count :0
count :1
initialize
count :0
count :1






さらに、クラスイニシャライザのような、プログラム中最初にコールされたときのみ実行される処理化処理を組み込むことも出来ます。

 
// 関数の定義
var getCounter = function() {
    console.log( "class initializer" );
 
 
    // ここで自分自身の関数を再定義する
    // (なので、これより上にある処理はプログラム中で一回しか呼ばれない)
    getCounter = function() {
        // コンストラクタ的な、初期化処理
        console.log( "initialize" );
        // この変数は呼び元から見えない(privateな状態になる)
        var counter = 0;
 
        return function() {
            console.log( "count :" + counter );
            return counter+=1;
        };
    };
};
 
 
// 呼び出しのテスト
var counter = getCounter();     // ここで、"initialize"が表示される。
alert( counter() );
alert( counter() );
 
var counter = getCounter();     // ここで、"initialize"が表示される。
alert( counter() );
alert( counter() );




consoleの出力結果

class initializer
initialize
count :0
count :1
initialize
count :0
count :1

関連記事

コメントを残す

メールアドレスが公開されることはありません。