模块的完整代码如下: 复制代码 代码如下: /*! L-amda "a-Lambda", a module provides Alternate "Lambda" style programming ability for JavaScript. Created By NanaLich. 2010-09-08 This module is published under WTFPL v2, so you just DO WHAT THE Fxxx YOU WANT TO with it. */ !function () { function attachEntry(o, a, m) { var i, j, n; o = [].concat(o); //if (!(o instanceof Array)) o = [o]; while (i = o.shift()) { for (j in a) { if (!i[n = a[j]]) i[n] = m; } } } var rx0 = /^s*(0|NaN|null)s*,$/; var rx1 = /([W]s*)((s*0s*,|(?:s*[a-z_$][w$]*s*,)+)|"(\[sS]|[^x22])*"|"(\[sS]|[^x27])*"/gi; var rx2 = /)/g; function rxGetFlags(rx) { // 取出正则表达式的创建选项 return (rx.global ? "g" : "") + (rx.ignoreCase ? "i" : "") + (rx.multiline ? "m" : ""); //return //([gim]*)$/.exec("" + rx)[1]; } attachEntry(RegExp, ["getFlags"], rxGetFlags); attachEntry(RegExp.prototype, ["getFlags"], function () { return rxGetFlags(this); });
function translateLambda(s) { if (typeof (s) != "string") s = "" + s; var x = new RegExp(rx1.source, rx1.getFlags()); var y = new RegExp(rx2.source, rx2.getFlags()); // 由于firefox、safari等浏览器对全局匹配正则表达式有过度的优化,所以这里采用一种迂回的办法创建不重复的正则表达式实例 var m, l = 0, r = ""; while (m = x.exec(s)) { var c = m[0], h, p, q, t; switch (c.charAt(0)) { // 判断期待的语法成分 case "$": case ")": case "]": case """: case """: continue; // 函数传参,跳过 }
h = m[2]; if (rx0.test(h)) h = ""; else h = h.substr(0, h.length - 1); // 去掉末尾的逗号 r += s.substring(l, p = m.index); // 在结果字符串上附加之前余留的内容 y.lastIndex = l = p + c.length; // 从逗号之后开始寻找右括号 while (q = y.exec(s)) { q = q.index; try { t = "return " + s.substring(l, q) + ";"; new Function(t); // 语法测试 //r += c + "function(" + h + "){ " + translateLambda(t) + " }"; // 翻译里面的内容 r += m[1] + "function(" + h + "){ " + translateLambda(t) + " }"; // 翻译里面的内容 x.lastIndex = l = q + 1; // 下一次查找从括号之后开始 break; } catch (ex) { } } if (!q) l = p; // 说明找不到右括号或者有效的代码,直接附加所有匹配的内容 } try { r += s.substr(l); if (/[w$]*|"(\[sS]|[^x22])*"|"(\[sS]|[^x27])*"/.exec(r)[0] == "function") // 粗略判断产生的是不是函数(可以应付绝大部分情况) r = "0," + r; // 使用这种“怪”形式可以在所有浏览器(包括IE)中得到预期的效果 new Function(r); // 语法测试 return r; } catch (ex) { // 失败,返回原文 return s; } };