2012-01-03 2 views
12

Я немного смущен тем, как функции работают в javascript. Я понимаю, что это все объекты, но как это изменится, как я буду использовать их в качестве аргументов?Когда объявлять новую (анонимную) функцию в javascript?

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

$(this).fadeIn(1000,function(){alert('done fading in');}); 

Почему я не могу добиться того же эффекта с:

$(this).fadeIn(1000,alert('done fading in')); 

Если да, то оно оценивается одновременно. То есть, (этот) элемент исчезает, и одновременно появляется предупреждение.

Когда я вызываю alert (arg), не создаю ли я новый объект, который передается в fadeIn()?

Как именно это работает?

+0

хорошо вопрос. Я буду придерживаться этого – OptimusCrime

+0

Для языковых ботаников: техника, которую вы хотите, называется * [partial function application] [1] *, также часто называемой * Currying *. Вам действительно нужна новая функция, где некоторые аргументы фиксированы, а другие - нет. [1]: http://en.wikipedia.org/wiki/Partial_application –

+1

@nd: Нет, на самом деле это не так. В этом примере не проводится каррирование или частичная оценка. Если вы ищете термин, * анонимная функция *. Также * функции более высокого порядка * для функций, которые принимают функции в качестве аргументов. – KaptajnKold

ответ

19

В этом

$(this).fadeIn(1000,alert('done fading in')); 

что делает FadeIn() см в качестве второго аргумента? Это результат вызова

alert('done fading in') 

мы делаем вызов, чтобы предупредить() перед тем вызовом FadeIn().

В этом случае

$(this).fadeIn(1000,function(){alert('done fading in');}); 

у нас есть объект

function(){alert('done fading in');} 

который FadeIn() вызывает в нужное время.

2

В первой строке вторым параметром является метод. А во второй строке - вызов метода.

вы также можете написать это

function fadeInCallback() { 
    alert('done fading in'); 
} 

$(this).fadeIn(1000, fadeInCallback); 

Так что мы делаем, что мы переходим в ссылке на fadeInCallback поэтому функции JQuery FadeIn можно назвать fadeInCallback, как только это сделано с замиранием.

Вторая линия будет выполнять

alert('done fading in'); 

перед тем executeing функции JQuery FadeIn

5

Когда вы пишете:

$(this).fadeIn(1000,alert('done fading in')); 

вызов функции с именем оповещения immadiately, помещая имя функции и скобки после этого имени. И для fadeIn результат этого вызова передается - это неопределено, потому что предупреждение возвращается всегда неопределенным.

Когда вы пишете

$(this).fadeIn(1000,function(){alert('done fading in');}); 

вы создаете функцию объекта, и передать эту функцию объекта FadeIn.Поэтому после завершения fadeIn это может вызвать эту функцию.

Это то же самое, как:

// create function 
var callback = function() { alert('done fading in'); }; 
// and pass this function to fadeIn 
$(this).fadeIn(1000, callback); 

но когда вы пишете:

var callback = alert('done fading in'); 
$(this).fadeIn(1000, callback); 

, то вы будете звонить оповещения immadiately и перейти к значению FadeIn которые бдительные возвращается - не определено.

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