一回しか使わない判別を何回も呼び出さない

by FiNGAHOLiC

HTML

<script src="https://getfirebug.com/firebug-lite-debug.js"></script>
<button id="btn1">slow</button>
<button id="btn2">fast</button>
<button id="btn3">closure</button>

JavaScript

// cookieの値とかブラウザ判別とか、一回ページが読み込まれたら変わらない値
var test = navigator.userAgent;

// クリックすると、上記の値によって分岐しアラートが表示される関数
var alertUA = function () {
    if (test.indexOf('Chrome') !== -1) {
        alert('Chromeだけどなにか?');
    } else {
        alert('Chromeとは違うんだよ。Chromeとは。');
    }
};

// bind
$('#btn1').click(function () {
    alertUA();
});

/*
 * これだと、クリックする度にif文の評価がされるけど、
 * 一回ページ読みこまれたときに評価したら以降変わることないから無駄。
 * よって、最初の呼び出し結果で自身を上書きすれば良い感じ。
 */
var alertUA_fast = function () {
    if (test.indexOf('Chrome') !== -1) {
        alertUA_fast = function () {
            alert('Chromeだけどなにか?');
        };
    } else {
        alertUA_fast = function () {
            alert('Chromeとは違うんだよ。Chromeとは。');
        };
    }
    alertUA_fast();
};

// bind
$('#btn2').click(function () {
    alertUA_fast();
});

// closure
var alertUA_closure = (function(ua){
    console.log('1回しか評価されない');
    var str = (/Chrome/i.test(ua))
        ? 'Chromeだけどなにか?'
        : 'Chromeとは違うんだよ。Chromeとは。';
    return function(){
        return alert(str);
    };
})(test);

// bind
$('#btn3').click(function(){
    alertUA_closure();
});