以下のブログで 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 と表示される
まとめ
ひゃっほい!