Теоретический вопрос о браузерных движках JavaScript - PullRequest
2 голосов
/ 11 марта 2010

Я сомневаюсь, что это возможно, и я уверен, что сделать это в производственной среде было бы впечатляюще плохой идеей. Это всего лишь одна из тех гипотетических вещей "я удивляюсь, если смогу ...".

Мне было интересно, возможно ли изменить или расширить способ обработки кода JavaScript в браузере во время выполнения. Например: если я попытался использовать лямбда-синтаксис в стиле C # в JavaScript:

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

Могу ли я изменить синтаксический анализ скрипта, перехватить лямбда-код и разобрать его сам?

Ответы [ 3 ]

3 голосов
/ 11 марта 2010

Сомневаюсь.

Движок, который анализирует и выполняет javascript, находится в браузере клиента, и поэтому не может быть изменен или изменен каким-либо веб-сайтом (я надеюсь).

Потенциально вы можете использовать поддерживаемые javascript типы и синтаксис для описания лямбда-выражения, а затем иметь собственную библиотеку javascript, которая расширяет ее до допустимых вызовов javascript.

Однако это было бы не очень полезно, поскольку функции JavaScript уже очень гибки. Ваш код выше в действительном JS будет выглядеть как эквивалентный делегат c #:

var x = myJsObjCollection.Where(function() { if (this.ID == 2) return this; });

Который не намного больше работы, чтобы напечатать.

Обновление

Чтобы сделать идею Боба на пару шагов дальше, вы могли бы написать что-то вроде этого:

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 голос
/ 11 марта 2010

Ответ в значительной степени "нет", но проверьте это: http://osteele.com/sources/javascript/functional/ и, в частности, материал о строке -> функция "приведение".

1 голос
/ 11 марта 2010

Нет прямого способа сделать это в JavaScript. Самое близкое, что вы могли бы получить - написать собственную функцию типа eval, которая будет интерпретировать любой код, который вы хотите.

Или, получите исходный код движка V8 JavaScript, внесите в него некоторые изменения и посмотрите, сможете ли вы каким-то образом реализовать его в Chrome:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...