Как я могу сгенерировать вложенное лямбда-выражение с захватом переменных

люди играют вокруг с функциями javascript, и это приводит к интересным шаблонам дизайна. Jquery использует многие из этих шаблонов и создает приятную оболочку вокруг многих функций. так что jquery в конечном счете похож на статический класс, в котором можно делать действительно аккуратные stuff ..

, как и все классы, у него есть имя, а по умолчанию - jQuery. $ - ничто не покупает идентификатор, который привязан к библиотеке jQuery и не позволяет вам вводить «jQuery» в качестве идентификатора.

Тот факт, что он является символом $, является произвольным. В какой-то момент было принято решение использовать символ $, но факт заключается в том, что он мог быть почти любым допустимым идентификатором ECMAScript.

Основная причина, по которой мы используем $ в качестве идентификатора, заключается в том, что вы вряд ли допустите простые ошибки опечатки при вводе одного символа вместо строки.

Надеюсь, что все ясно. Пожалуйста, исправьте меня, ребята, если у меня что-то не так

A простой пример, например, что моя собственная библиотека скажет класс калькулятора

var Calculator= (function()
{

    function add(a,b)
    {
     return a+b;
    }
    function subtract(a,b)
    {
     return a-b;
    }
    function multiply()
    {
     return a*b;
    }
    function log()
    {
      console.log("log 123")
    }
    return
    {
     add: add,
     subtract: subtract,
     multiply: multiply
    }
}());

Теперь я могу выполнить операцию с использованием класса Calculator следующим образом:

Calculator.multiply(Calculator.add(2,3),5);

добавить, что мои локальные функции частные и не подвергаются воздействию снаружи. В этом случае моя функция журнала не может быть доступна с помощью Calculator.log, он скажет, что метод не найден на объекте.

Теперь, возвращаясь к вашему вопросу, вы можете сделать что-то вроде этого:

var _ = Calculator;

и теперь используют функции calc, такие как

_.multiply(_.add(2,3),5);

. Интересно, что библиотека также называется underscore ..

1
задан max630 17 January 2019 в 16:51
поделиться

1 ответ

Необходимо убедиться, что выражения переменных в лямбда-выражении ссылаются на один и тот же экземпляр.

Этот код работает очень хорошо и, похоже, дает ожидаемый результат.

void Main()
{
   var var = Expression.Variable(typeof(Foo), "foo");

   var expr = Expression.Lambda(
    Expression.Lambda(
        Expression.Call(var, typeof(Foo).GetMethod("Bar"))), new[] {  var });

    var res = (Action)expr.Compile().DynamicInvoke(new Foo());

    res();
}

class Foo
{
    public void Bar()
    {
        Console.WriteLine("Bar");
    }
}
0
ответ дан Rodrick Chapman 17 January 2019 в 16:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: