IT戦記

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

JavaScript 1.8 では無名関数が書きやすくなる。

以下のブログで JavaScript 1.8 の新文法が紹介されています。

http://ejohn.org/blog/javascript-18-progress/
MDC の資料 -> http://developer.mozilla.org/en/docs/New_in_JavaScript_1.8

その中でも無名関数についての新文法が楽しいので紹介します。

// 関数の中に文が一つでその評価値を return してるような関数は
function(x) { return x * x }
// 以下のように書ける
function(x) x * x

たとえば

[1, 2, 3, 4, 5].filter(function(x) x < 3); // [1, 2]
element.addEventListener('click', function(e) e.stopPropargation(), false); // click イベントを親要素にバブリングさせない。

のようなことが出来る。

もちょっと詳しく

// 名前付きの関数
function inspect(f) alert(f); // OK

// 文字列表現
inspect.toString(); // function inspect(f) alert(f);
inspect.toSource(); // function inspect(f) alert(f);

// typeof
alert(typeof inspect);                            // function
alert(inspect instanceof Function);               // true
alert(Function.prototype.isPrototypeOf(inspect)); // true

// 空の関数
alert(function());        // syntax error
alert(function(););       // syntax error
alert(function() void 0); // OK
alert(function() {});     // 当然 OK

// 複数の文の評価
function() hoge(), fuga();      // syntax error
function() hoge(); fuga();      // function() hoge() と fuga() に分けて評価される
function() { hoge(); fuga(); }; // OK だが undefined が返されるため fuga() の評価値を返したい場合は当然 return がいる

// getter
var obj = { _value: 5, get value() this._value / 2 }; // OK
alert(obj.value); // 2.5

// setter
obj = { set value(v) this._value = v / 2 }; // OK
obj.value = 1;
alert(obj._value); // 0.5
// 注意
var a = obj.value = 1; // こうすると a は 0.5 になるので注意!!!

ちょっと脱線

これで、関数指向のプログラミングが書きやすくなったと思います。
たとえば、前に弾さんがやっていた Lambda Calculus ももっと奇麗に書けるようになります。
http://blog.livedoor.jp/dankogai/archives/50415357.html

// 準備
var zero = function(f) function(x) x;
var succ = function(n) function(f) function(x) f(n(f)(x));
var add = function(m) function(n) function(f) function(x) m(f)(n(f)(x));
var mul = function(m) function(n) function(f) m(n(f));
var pow = function(m) function(n) n(m);
Function.prototype.toJavaScriptNumber = function() this(function(n)n+1)(0);


// 100 * 100 を求めてみる
var two   = succ(succ(zero));    // 2
var five  = succ(add(two)(two)); // 5
var six   = succ(five);          // 6

var ni = pow(two); // λx.2^x

// 100 -> 1100100
var hyaku = add(add(ni(two))(ni(five)))(ni(six)); // 100

alert(mul(hyaku)(hyaku).toJavaScriptNumber()); // 10000 と表示される

まとめ

ひゃっほい!