2014-01-30 5 views
1

Я использую функцию checkForm для проверки простой формы. Когда пользователь нажимает submit, запустите checkForm. В чем разница между первым и вторым примером?В чем разница между вызовом функции и возвратом функции?

Пример 1.

$('form').submit(function(){ 
    checkForm(); 
}); 

Пример 2.

$('form').submit(function(){ 
    return checkForm(); 
}); 
+0

Что возвращает 'checkForm()'? – Satpal

+0

В обработчике событий вы можете вернуть 'true' или' false', последний объединяет 'preventDefault' и' stopPropagation' в jQuery, останавливая отправку формы, поэтому, если функция 'checkForm()' возвращает 'false', форма не отправляется, если он возвращает 'true', форма отправляется и т. д. – adeneo

+3

В примере 2 вы не возвращаете функцию, вы возвращаете результат выполнения функции. Возврат функции будет выглядеть так: 'return checkForm;'. Конечно, это не имеет смысла в этом случае, но я считаю, что различие важно. –

ответ

4

Во втором примере вы на самом деле не возвращаются функция, а скорее результат выполнения функции. (. С учетом выполнения кода из справа налево в данном случае)

Для иллюстрации, немного изменить свой первый пример:

$('form').submit(function(){ 
    var result = checkForm(); 
}); 

Как вы можете видеть, функция выполняется и результат возвращается из функции. Просто так ничего не происходит с этим результатом. Он сразу же выходит из сферы действия, когда анонимная функция завершается, исчезая в древности.

Слегка изменить второй пример для дальнейшей иллюстрации:

$('form').submit(function(){ 
    var result = checkForm(); 
    return result; 
}); 

Так же, как и в первом примере, checkForm выполняется и ее результат сохраняется в переменной. Затем это значение возвращается из анонимной функции. Естественно, что этот процесс может быть в подкладке, так что временная переменная не требуется:

$('form').submit(function(){ 
    return checkForm(); 
}); 

Порядок операций не меняется, checkForm выполняется, возвращает результат, и что результат возвращается из анонимная функция.

Вы могли вернуть саму функцию, что оно фактически не выполнил его:

$('form').submit(function(){ 
    return checkForm; 
}); 

Поскольку функции являются «граждане первого класса» в JavaScript и может передаваться, как и любой другой переменной, будет возвращен фактическая функция, а не результат функции. Предполагалось, что код вызова, вероятно, завершит выполнение функции.Однако в этом случае (обработчик) это, конечно, не имеет смысла, поскольку он ожидает логическое значение, а не функцию.

+0

Спасибо за подробный ответ, он действительно разъясняет различия. – Operator

2

Основное различие в коде является то, что в первом случае вы просто запустите проверку и во втором случае, если ваша проверка возвращает логическое значение, которое вы будет препятствовать отправке формы.

Так что в первом случае ваша форма будет отправляться каждый раз, даже если checkForm() вернет false. Во втором случае, если checkForm() вернется true, ваша форма будет отправлена, и если она вернет false, это предотвратит отправку формы.

Поэтому в основном предположить checkForm() возвращение false, ваша функция будет выглядеть в первом примере, как:

$('form').submit(function(){ 
    false; 
}); 

и во втором примере:

$('form').submit(function(){ 
    return false; 
}); 
+0

Спасибо за ваш ответ, поэтому я заметил. Но почему функция checkForm не позаботится об этом сама по себе? Почему нам нужно вернуть функцию, чтобы предотвратить отправку в случае ложного значения? – Operator

+0

Вы не возвращаете функцию в свой пример, вы возвращаете результат функции. Поэтому, если вы добавите '()' к имени своей функции, это будет просто вызвано. И даже если у вас внутри этой функции выражение 'return', это не будет препятствовать отправке формы до того, как вы будете иметь оператор' return' в 'submit'. – antyrat

+0

@Operator см. Мой обновленный ответ – antyrat

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