我怀疑这是可能的,而且我肯定在生产环境中这样做会是一个令人印象深刻的坏主意。这只是那些假设的“I-wonder-if-I-could ......”的事情之一。
我想知道是否可以修改或扩展浏览器JavaScript引擎在运行时解析代码的方式。例如:如果我尝试在JavaScript中使用C#style lambda语法:
var x = myJsObjCollection.Where(a=>a.ID == 2);
我可以修改脚本的解析并拦截lambda代码并自己解析吗?
答案 0 :(得分:3)
我对此表示怀疑。
解析并执行javascript的引擎在客户端的浏览器上,因此不能被任何网站修改或更改(我希望)。
您可以使用javascript支持的类型和语法来描述lambda表达式,然后拥有自己的javascript库,将其扩展为有效的javascript调用。
然而,由于javascript函数已经非常灵活,因此它不会那么有用。您在有效JS中的代码看起来像等效的c#delegate:
var x = myJsObjCollection.Where(function() { if (this.ID == 2) return this; });
输入的内容并不多。
<强>更新强>
要进一步采取Bob's Idea步骤,您可能会写下这样的内容:
function lambda(vName, comparison)
{
var exp = new RegExp("\\b" + vName + "\\.", "g");
comparison = comparison.replace(exp, "arg.");
return function(arg) {
var result;
eval("result = " + comparison + ";");
return result;
};
}
然后你的Where函数看起来像:
Array.prototype.Where = function(lambdaFunc) {
var matches = [];
for (var i in this)
{
if (lambdaFunc(this[i]))
matches[matches.length] = this[i]
}
return matches;
};
你可以称之为:
var x = myJsObjCollection.Where(lambda("a", "a.ID == 2"));
答案 1 :(得分:1)
在JavaScript中没有直接的方法可以做到这一点。你可以得到的最接近的是编写自己的eval
类型函数,它可以解释你想要的任何代码。
或者,获取V8 JavaScript引擎源代码,对其进行一些更改,看看是否可以以某种方式在Chrome中实现它:)
答案 2 :(得分:1)
答案几乎是“不”,但请查看:http://osteele.com/sources/javascript/functional/,特别是有关字符串的内容 - &gt;功能“强制”。