IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

JavaScript で遅延評価

ぶっちゃけ

僕は遅延評価のことたぶんあんまり理解してないと思います。

でも、とりあえずこんなの作ってみた

function l(a) { return typeof a == 'function' ? a() : a } // lazy の l

こうやって使う

function add(i, j) { return l(i) + l(j) }

var count = 0;

alert(add(1, 1));                            // 2
alert(add(1, function(){ return 1 }));       // 2
alert(add(1, function(){ return count++ })); // 1
alert(add(1, function(){ return count++ })); // 2
alert(add(1, function(){ return count++ })); // 3

これって遅延評価なのかな

でも、関数作るときに意識しないといけないから違うのかな。

もう一個、こんなの作ってみた

function l(v) { return { valueOf: v } }

こうやって使う

function add(i, j) { return i + j }

var count = 0;

alert(add(1, 1));                               // 2
alert(add(1, l(function(){ return 1 })));       // 2
alert(add(1, l(function(){ return count++ }))); // 1
alert(add(1, l(function(){ return count++ }))); // 2
alert(add(1, l(function(){ return count++ }))); // 3

これって遅延評価なのかな

こっちは、関数作るときに意識しないでいいけど。イコールのときに評価してくれない

追記:こんなのも思いついた

Function.prototype.lazy = function() { return { valueOf: this } };

ただ関数プロトタイプにしただけだけど

var random = Math.random.lazy()

function add(i, j) { return i + j }

alert(add(random, 1));
alert(add(random, 2));
alert(add(random, 3));
alert(add(random, 4));
alert(add(random, 5));

うわあああああああああああああああああああああああ!
これは予想以上に感動したあああああああ!

やべ

雑誌の原稿書かないと・・・・