关于浏览器javascript引擎的理论问题

时间:2010-03-11 00:20:16

标签: javascript browser lambda

我怀疑这是可能的,而且我肯定在生产环境中这样做会是一个令人印象深刻的坏主意。这只是那些假设的“I-wonder-if-I-could ......”的事情之一。

我想知道是否可以修改或扩展浏览器JavaScript引擎在运行时解析代码的方式。例如:如果我尝试在JavaScript中使用C#style lambda语法:

var x = myJsObjCollection.Where(a=>a.ID == 2);

我可以修改脚本的解析并拦截lambda代码并自己解析吗?

3 个答案:

答案 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"));

http://jsbin.com/ifufu/2/edit的工作示例。

答案 1 :(得分:1)

在JavaScript中没有直接的方法可以做到这一点。你可以得到的最接近的是编写自己的eval类型函数,它可以解释你想要的任何代码。

或者,获取V8 JavaScript引擎源代码,对其进行一些更改,看看是否可以以某种方式在Chrome中实现它:)

答案 2 :(得分:1)

答案几乎是“不”,但请查看:http://osteele.com/sources/javascript/functional/,特别是有关字符串的内容 - &gt;功能“强制”。