Ruby のブロックスコープ風の構文を JavaScript に取り入れるとすると…
(ε・◇・)з o O ( Ruby のブロックスコープ的なコードですかー
console.log([1,2,3].map2('{|i| "<li>" + i + "</li>" }').join("")); console.log([1,2,3].map2('{|i| var rv = "<li>" + i + "</li>"; rv }').join("")); console.log([1,2,3].map2('{|i| return "<li>" + i + "</li>" }').join(""));
<li>1</li><li>2</li><li>3</li>
Array.prototype.map2 = function(expr, // @arg Function/RubyBlockExpression: that) { // @arg Mix: callback.call(that) // @ret Array: function _block(expr) { var m = /^\{\s*\|\s*([^\|]+)\s*\|\s*(.*)\}$/.exec(expr.trim()), args, code, lines, last; if (m) { args = m[1].trim(); code = m[2].trim(); if (/return/.test(expr)) { return new Function(args, code); } lines = code.split(/;(?:[\r\n]|\s+)/); last = lines.length - 1; lines[last] = "return " + lines[last]; return new Function(args, lines.join(";")); } return null; } if (typeof expr === "string") { expr = _block(expr); } return this.map(expr, that || null); };
(ε・◇・)з o O ( 5分で書くと、こんな感じ?
(ε・◇・)з o O ( new Function 使ってるので周囲の環境もちこせずー クロージャとしては使えませんね