Проблема и причина
Один из моих товарищей по команде оказался в беспорядочной ситуации, реализуя перехват функций в javascript. это фактический код
function ActualMethod(){
this.doSomething = function() {
this.testMethod();
};
this.testMethod = function(){
alert("testMethod");
};
}
function ClosureTest(){
var objActual= new ActualMethod();
var closeHandler = objActual.doSomething;
closeHandler();
closeHandler.apply(objActual,arguments); //the fix i have added
this.ActualTest = function() {
alert("ActualTest");
};
}
В приведенном выше коде var closeHandler создается в контексте ClosureTest (), но он содержит обработчик ActualMethod.doSomething. Всякий раз, когда вызов closeHandler () заканчивался ошибкой «объект не поддерживает этот метод».
Это потому, что функция doSomething () вызывает другой метод внутри, называемый this.testMethod () ;. Здесь this относится к контексту вызывающего, а не вызываемого абонента. Поэтому я предполагаю, что closeHandler связан с фактически созданной средой (ClosureTest). Даже если он удерживает обработчик в другом контексте, он просто предоставляет свойства своего контекста.
Решение
Чтобы избежать этого, я предлагаю использовать apply для указания контекста, в котором он должен выполняться.
closeHandler.apply (objActual, аргументы);
Вопросы
это идеальный сценарий для замыканий .. ??
Какие интересные места вы встретили в javascript? .. *
UPDATE
Да, это просто, я могу вызвать метод напрямую. но проблема в том, что в конкретном сценарии мне нужно перехватить вызов метода actall и запустить некоторый код перед этим, наконец, выполнить фактический метод ..
скажем для примера, я использую стороннюю библиотеку aspx grid, и все события щелчка мышью отслеживаются их элементами управления. В определенной группе щелчком мыши мне нужно перехватить вызов их ilbrary метода и подключить мой mthod для выполнения вместо этого и перенаправить вызов фактическому библиотечному методу
надеюсь, это поможет