бесконечный цикл обратного вызова jQuery .animate () - PullRequest
4 голосов
/ 24 июня 2011

Простой вопрос: почему я могу это сделать

var start = function() {
    $('#element').animate({}, 5000, 'linear', start);
}

но не это

    function start() {
        $('#element').animate({}, 5000, 'linear', start());
    }

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

Ответы [ 5 ]

8 голосов
/ 24 июня 2011

Либо использовать

function start() {
    $('#element').animate({}, 5000, 'linear', start);
}

или

function start() {
    $('#element').animate({}, 5000, 'linear', function(){ start(); });
}

второй случай полезен, если вы хотите передать некоторые аргументы для запуска ..

4 голосов
/ 24 июня 2011

потому что в первом из них вы отправляете пространство имен функции, когда вы добавляете () к концу имени функции, она немедленно выполняет функцию

4 голосов
/ 24 июня 2011

Во второй функции вы выполняете функцию вместо передачи ссылки на функцию, поэтому она входит в бесконечный цикл.

Измените вторую функцию с:

function start() {
 $('#element').animate({}, 5000, 'linear', start());
}

до

function start() {
  $('#element').animate({}, 5000, 'linear', start); //Notice the change to start
}
3 голосов
/ 24 июня 2011

Во втором примере вы в основном делаете рекурсивный вызов start().

То, что вы хотите сделать, это передать саму функцию запуска, как вы делаете в своем первом примере.Ваш второй пример предоставляет только результат вызова start().

2 голосов
/ 24 июня 2011

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

start() немедленно вызовет start и передаст возвращаемое значение .animate(). Это вызывает бесконечную самовосстановление.

...