Я могу получить некоторый совет относительно делегатов JavaScript?

Для записи я использовал TCC, Крошечный компилятор C , для быстрого тестирования маленького кода. Это может генерировать exe и DLLs.
Вы, возможно, должны были бы загрузить заголовки Windows: это имеет ограниченное подмножество, Вы могли бы хотеть больше.

Цифровой Марс также имеет бесплатный компилятор C/C++ разумного размера.

6
задан Cᴏʀʏ 13 July 2009 в 22:04
поделиться

2 ответа

Хорошо, кое-что:

  1. Делегаты чрезвычайно просты в javascript, поскольку функции являются членами первого класса .
  2. Function.apply позволяет вызывать функцию с массивом аргументов.

Вы можете написать это так

function Field_Changed(delegate, args)
{
    if (isBlocking()) return false;
    if (isDirty(args[0])) { //args[0] is el
        delegate.apply(this, args);
        waitForCallback();
    }
}

И называть это так:

Field_Changed(Agent().Field2_Changed, [el, getApplicationState(), whatever...]);
5
ответ дан 17 December 2019 в 07:08
поделиться

Я использовал следующую служебную функцию, которую написал много лет назад:

/**
 * @classDescription This class contains different utility functions
 */
function Utils()
{}

/**
 * This method returns a delegate function closure that will call
 * targetMethod on targetObject with specified arguments and with
 * arguments specified by the caller of this delegate
 * 
 * @param {Object} targetObj - the object to call the method on
 * @param {Object} targetMethod - the method to call on the object
 * @param {Object} [arg1] - optional argument 1
 * @param {Object} [arg2] - optional argument 2
 * @param {Object} [arg3] - optional argument 3
 */
Utils.createDelegate = function( targetObj, targetMethod, arg1, arg2, arg3 )
{
    // Create an array containing the arguments
    var initArgs = new Array();

    // Skip the first two arguments as they are the target object and method
    for( var i = 2; i < arguments.length; ++i )
    {
        initArgs.push( arguments[i] );
    }

    // Return the closure
    return function()
    {
        // Add the initial arguments of the delegate
        var args = initArgs.slice(0);

        // Add the actual arguments specified by the call to this list
        for( var i = 0; i < arguments.length; ++i )
        {
            args.push( arguments[i] );
        }

        return targetMethod.apply( targetObj, args );
    };
}

Итак, в вашем примере я бы заменил

function Field1_Changed(el) {
    Field_Changed(el, delegate(Agent().Field1_Changed, $j(el).val()), true);
}

чем-то вроде

function Field1_Changed(el) {
    Field_Changed(el, Utils.createDelegate(Agent(), Agent().Field1_Changed, $j(el).val()), true);
}

Тогда внутри Agent (). FieldX_Changed Я бы вручную вызвал getApplicationState () (и инкапсулировал эту логику в общий метод обработки изменений полей, которые все из Agent () .FieldX_Changed методы будут вызывать внутренние).

0
ответ дан 17 December 2019 в 07:08
поделиться
Другие вопросы по тегам:

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