2013-08-30 6 views
1

Почему нельзя использовать определенную функцию как обратный вызов события?Использование определенной функции вместо анонимной функции в качестве обратного вызова

<div id="me"> 
    <input> 
</div> 

$(document).ready(function(){ 
    // $("#me").on('keyup', 'input', doit()); # doesn't work 
    // $("#me").on('keyup', 'input', 'doit'); # neither does this 
    $("#me").on('keyup', 'input', function() { 
    doit(); 
    }); // well, this one works of course 
}); 

function doit() { 
    console.log($("input").val()); 
} 
+5

Когда вы проходите в doit() в качестве обратного вызова, вы – roblarsen

+1

вы ... его как будто вы входите в пустоту;) – andlrc

+2

этот комментарий очень напряжен. – Marc

ответ

6

Вы должны передать функции, а не называть его

$("#me").on('keyup', 'input', doit) 

Чтобы очистить, почему это не так, см этот пример:

$("#me").on('keyup', 'input', (function() { 
    doit(); 
})()); 

Здесь вы передаете анонимную функцию и вызова это немедленно, чего не ожидает обработчик событий.

Проблема заключается не в различии между анонимным или нет, проблема в том, что вы вызываете функцию вместо ее передачи.

8

Вы должны передать функцию в качестве параметра.

$("#me").on('keyup', 'input', doit); 
+0

Спасибо. Пробовал это, и это работает: http://jsbin.com/IZecIj/1/edit Но я все еще озадачен, почему это так. Кстати, у меня была опечатка в опубликованном коде, я тоже попробовал '' doit''. –

+0

@MajidFouladpour Так же работает с предупреждением, поэтому попробуйте использовать alert вместо 'console.log' .. может быть jsbin переопределяет' console.log'? не уверен –

+0

@ Vega, 'console.log' отлично работает; Я использовал '' doit'' вместо 'doit'. –

1

, когда вы говорите что-то = функция() {blah} в js, он сохраняет это как текст и анализирует его на лету - так что да, вы можете. Например:

CallMe = function(){ alert("blah!"); } 
bobsCallback.setFunction(CallMe); 

CallMe, как и любой другой переменной, но это содержание является JS для функции. Вы можете передавать его в качестве обратного вызова или вызова, как так:

alert("calling CallMe..."); 
CallMe(); 
2

Когда вы передаете в doit() (с «()») в качестве обратного вызова, вы на самом деле работает функция в этой точке и передают в возвращаемое значение функции (вероятно, undefined) в качестве обратного вызова. Если вы передадите только ссылку на именованную функцию doit, тогда функция будет выполнена как обратный вызов.

+0

Добро пожаловать в SO Rob! ;-) – Mathletics

+0

ДА. Хотя я был вокруг немного. Это один из первых вопросов, которые я не ответил, хотя ответил. – roblarsen

Смежные вопросы