2010-04-14 6 views
2

Я пытаюсь вызвать метод страницы с помощью функции события «присоединенного» jQuery, в которой мне нравится использовать закрытие, чтобы локальное событие было локальным, как показано ниже, но вызовы метода страницы объявляют несколько «ошибок» функций и Я хотел бы использовать одну функцию для всех из них. Если в приведенном ниже коде я обрабатывал ошибку и не успевал, как я могу использовать мой одиночный анонимный обработчик для всех 3 функций ошибок?Как ссылаться на функцию анонимного JavaScript?

 $(":button").click(function() { 
      var button = this; 
      PageMethods.DoIt(
       function (a, b, c) { 
        alert(button); 
       }); 
     }); 

Этот пример передает анонимную функцию для обратного вызова успеха. Есть только один из них. Если бы я передавал обратный вызов ошибки, как я мог использовать функцию (e, c, t) для всех 3 обратных вызовов ошибок?

ADDED: То, что я хотел бы сделать здесь, вызывает вызов AJAX всякий раз, когда пользователь нажимает кнопку переключения (флажок), но для улучшения реагирования я хочу немедленно переключить состояние кнопки и только «развязать» ее, если вызов AJAX терпит неудачу.

Теперь в моем обработчике события на сторону клиента click(), я хотел бы использовать анонимные функции в области видимости click()' so that the functions have access to the это event argument, but I don't want to 'declare' three functions for the onTimeout , OnError , and 'onAbort аргументов функции PageMethods.MyFunction. если я объявляю именованную функцию вне обработчика кликов, она больше не имеет доступа к параметру 'this' этого обработчика событий click().

+0

Не совсем понятно, что вы пытаетесь сделать. объясните себя лучше. –

ответ

2

Я думаю, что вы можете поместить переменную с именем перед ним, как это:

var myFunction = function(a, b, c) { ...

Это было какое-то время я еще не сделали этого, но вы могли бы дать ему попробовать.

1

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

var myFunction = function (a, b, c) { 
    /* tum de dum */ 
}; // don't forget this semicolon 

Затем вы можете использовать эту функцию в разных местах:

$(":button").click(myFunction); 
/* don't put braces after the function name when referencing it, 
    else it will be called immediately */ 

Вы можете найти более подробную информацию о функциональных выражений и объявления функций в статье Named function expressions demystified.

0

Вы не можете. вся точка из функции анонимного, что он имеет не имя и, таким образом, нельзя ссылаться. (Фактически, «анонимный» - это в основном греческое слово «неназванный».)

Если вы хотите ссылаться на него, вам нужно указать ему имя.

+0

Я могу утверждать, получает ли функция имя в выражении функции (например, в SK и моих примерах) или нет. Это * все еще анонимные функции, назначенные переменным. Используя переменные, вы можете ссылаться и называть их. –

+0

@Marcel Korpel: Если вы присвоите его имени (т. Е. Переменной), оно уже не является анонимным. –

+0

Нет, это остается анонимным. То, что вы видите, например, Firebug - это разобранное имя. Пожалуйста, прочитайте http://yura.thinkweb2.com/named-function-expressions/#names-in-debuggers о Firebug, в котором вы видите '(?)()' В стеке вызовов. –

0

Из анонимной функции вы можете ссылаться на нее как arguments.callee (это достигается анонимная рекурсия).

+0

Интересно, но я не думаю, что это отвечает (двусмысленный) вопрос. –

3

Если ваша цель состоит в том, чтобы сохранить эту функцию из глобального масштаба, используйте the module pattern:

(function() { 
    function asplode() { 
    alert('Your head asplode.'); 
    } 

    $('body').click(asplode); 
})(); 
0

Если я правильно понимаю, что вы хотите сделать, вы можете быть в состоянии выполнить это следующим образом:

function handler(a, b, c) { 
     alert(this); // button 
    } 

    $(":button").click(function() { 
     var button = this; 
     PageMethods.DoIt(function() { 
      handler.call(button, a, b, c); 
     }); 
    }); 
Смежные вопросы