前回 の続き。
前回はバッファを関数(立派なオブジェクト)のプロパティとし、あえてプロパティ名の頭に "_" を付けることでプライベートなもの風、つまり人為的に外からは見ちゃいけないものとしておいた。これは結局はパブリックなプロパティなのだが、もうちょっと隠蔽しようじゃないかというのが今回の話。
比較のために、前回のものをもう少しわかりやすく書いてみた。
function strangeOutput(){ var f = arguments.callee; if(arguments.length){ f._buffer += Array.prototype.slice.call(arguments); // JS 1.6 ならばこれでよい // f._buffer += Array.slice(arguments); } else{ print(f._buffer); f._buffer = ""; } return f; } strangeOutput._buffer = "";
strangeOutput
が見える場所ならばその _buffer
プロパティにアクセスし放題で美しくない。
そこでクロージャを使ってみた。
var strangeOutput = (function(){ var buffer = ""; return function(){ var f = arguments.callee; if(arguments.length){ buffer += Array.prototype.slice.call(arguments); // JS 1.6 ならばこれでよい // buffer += Array.slice(arguments); } else{ print(buffer); buffer = ""; } return f; }; })();
変数 buffer
は 外部からは見えない。これはいい。最高だ。だが関数の定義として見ると気持ち悪いかも。