2015-01-02 5 views
1

Я создал функцию, которая вызывается, когда происходит событие. Прямой вызов моей функции не работает, и мне нужно использовать анонимную функцию. Зачем мне это нужно? Может ли кто-нибудь объяснить логику, чтобы я не потерял время для таких глупых ошибок?Использование функции в качестве параметра функции: зачем использовать функцию анонима?

не работает, так как прямой вызов функции checkInBackEnd

$('#signup-email').change(
    checkInBackEnd($('#signup-email'), 'email-unique.php', function(result){ 
     if(result == 1){ 
      $('#signup-error-email').show(); 
     } 
     else{ 
      $('#signup-error-email').hide(); 
     } 
    }) 
); 

Это работает, потому что я использую анонимная функция является функцией изменения:

$('#signup-email').change(function(){ 
    checkInBackEnd($('#signup-email'), 'email-unique.php', function(result){ 
     if(result == 1){ 
      $('#signup-error-email').show(); 
     } 
     else{ 
      $('#signup-error-email').hide(); 
     } 
    }); 
); 

Спасибо

+2

Это происходит потому, что 'checkInBackEnd ($ (...))' является вызовом функции. Вы не должны вызывать функцию, когда _a ссылка ожидается_. Или, если вы собираетесь, позаботьтесь о том, чтобы вызываемая функция возвращала ссылку на функцию (или анонимную функцию). – Teemu

+0

Так как я понимаю, мы не можем вызвать функцию непосредственно в параметрах функции? Мы должны использовать анонимную функцию все время? – DescampsAu

+1

Мы можем, но если нужно, зависит от того, как этот конкретный параметр используется в изначально вызванной функции. – Teemu

ответ

3

Это Безразлично 't должна быть анонимной функцией. Вы можете определить функцию с именем:

function doCheckIn() { 
    checkInBackEnd($('#signup-email'), 'email-unique.php', function(result){ 
    if(result == 1){ 
     $('#signup-error-email').show(); 
    } 
    else{ 
     $('#signup-error-email').hide(); 
    } 
} 

, а затем передать, что в качестве обратного вызова аргумента:

$('#signup-email').change(doCheckIn); 

Мы обычно используем анонимные функции, потому что эти функции обратного вызова необходимы только в этом одном месте. Нет необходимости указывать его имя, если оно будет использоваться только один раз. Через некоторое время вы привыкнете к этой идиоме.

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

0

Разбейте свой код, чтобы лучше понять: Во-первых, давайте посмотрим на упрощенный пример:

function fakeChangeFunction(myFn) { 
    val result = myFn(); // We expect to have a function 
    doSomethingWithResult(result); 
} 

function myChangeFunctionExample() { 
    alert('foobar'); 
    // returns undefined implicitly 
} 

// Doesn't work 
fakeChangeFunction(myChangeFunctionExample()); // This will cause an error 

// Works 
fakeChangeFunction(myChangeFunctionExample); // Notice no parenthasis 

// Works 
fakeChangeFunction(function() { 
    myChangeFunctionExample(); 
}); 

// Works 
function returnsAFunction() { 
    return function() { 
    alert('barfoo'); 
    }; 
} 

fakeChangeFunction(returnsAFunction()); 
Смежные вопросы