Динамически заменяющие функции, которые не находятся в глобальной области видимости - PullRequest
1 голос
/ 28 апреля 2011

У меня есть сценарий, который основан на определенных сценариях, возможно, потребуется заменить функции, чтобы выполнить некоторую обработку, прежде чем в конечном итоге вызвать исходную функцию. (См. «« переопределение »Javascript Function »)

Я могу заставить это работать вообще - вот базовый пример с использованием плагина jQuery Tinyscrollbar (не мое предназначенное приложение, просто что-то быстрое и простое для иллюстрации):

(function ($) {
    // Snip..

    function initalize() {
        oSelf.update();
        setEvents();
        return oSelf;
    }

    // Snip..

    function setEvents() {

        (function () {
            var oldInit = wheel;

            wheel = function (oEvent) {
                console.log('Intercept');
                oldInit(oEvent);
            }
        })();

        // Original event code, irrelevant to question
    }

    function wheel(oEvent) {
        // Actual function, related to using the mousewheel
    }

})(jQuery);

Когда я прокручиваю колесико мыши, консоль печатает «Перехват», и полоса прокрутки перемещается в соответствии с первоначальным определением. Замечательно!

Однако имя функции жестко закодировано и не находится в глобальной области видимости, поэтому window [] недоступно (что мне нравится). Существует ли какая-либо возможная комбинация черной магии, «новой функции ()» и / или другого способа, чтобы пройти через потенциальный список имен функций (которые могут изменяться в зависимости от другой логики) и инкапсулировать их в это (или аналогично дух) манера?

Заранее спасибо!

1 Ответ

1 голос
/ 28 апреля 2011

К сожалению, невозможно перечислить или динамически получить доступ к элементам в объекте области (за исключением удобного глобального объекта области / окна)

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

Есть некоторая дополнительная хитрость, если вы изменяете свои функции после того, как начали назначать их в качестве обработчиков событий или чего-то еще. Если вам случится использовать какую-то оболочку bind () для этих функций, правильность вашего поведения во многом будет зависеть от этой функции bind ().

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

Если вы не хотите задним числом, вам все равно нужно убедиться, что у вас нет некоторой версии оригинального метода, привязанной к bind (), и которая все еще используется для новых обратных вызовов после того, как произошла ваша замена .

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