2012年1月11日水曜日

遅延評価の把握

http://d.hatena.ne.jp/amachang/20061204/1165180769
こちらを参考にjavascriptで実験してみました。
Function.prototype.funcObj = function() { return { valueOf : this } };
var random = function()
{
  var res = Math.random();
  alert('randomL:'+res);
  return res;
}
function add(i, j) {
  alert('add');
  if(j>0){
    return i+j;
  }
  return j;
}

alert(add(random(), 1));
alert(add(random(), 0));
alert(add(random.funcObj(), 1));
alert(add(random.funcObj(), 0));
普通にrandom()を引数に渡すとadd()の第二引数に関係なく必ずrandom()が実行されますが、
random().funcObj()を引数に渡すと先にadd()が呼ばれて第二引数によってはrandom()が実行されないのを確認。

こんな感じでしょうか。
しかし、
Function.prototype.funcObj = function() { return { valueOf : this } };
これがいまいち理解出来ていなくて、連想配列としてvalueOfを誰かが自動的に呼んで、その際に関数を実行させないで、自分のオブジェクトを返すって事でいいのでしょうか。

0 件のコメント:

コメントを投稿