Функция не определена в setInterval

Привет, у меня есть что-то вроде этого:

$(document).ready(function(){

 $("#all").height($(window).height()-60);

$('a').bind({
  mouseover:function(){
   $(this).stop().animate({opacity:0.8},500);
 },
 mouseout:function(){
   $(this).stop().animate({opacity:1},500);
 },
   click:function(){
 }
});


// CLOUDS SCROLL 

 function cloudScroll(){
     var current=parseFloat($('#clouds').css('left'));
     current += 1;
     $('#clouds').css("left",current);
 }

var init = setInterval('cloudScroll()', 270);

});

Кажется, это довольно легко, но в любом случае это возвращает: cloudScroll не определен.
Зачем?

4 ответа

Решение

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

var init = setInterval(cloudScroll, 270);

setInterval выполняется в глобальном пространстве имен, но ваша функция облачной прокрутки определена в анонимной функции document.ready.

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

setInterval(function (){ cloudsScroll() }, 270);

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

Попробуйте это:

var init = setInterval(cloudScroll, 270); 

... и если вы хотите передать аргументы:

setInterval(scrollCloud, 250, clouds2);

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

setInterval(function(){
  scrollCloud(clouds2);
}, 250);

Если вы передадите ссылку на функцию, а не на строку, она будет работать:

var init = setInterval(cloudScroll, 270);

Просто чтобы показать, как это работает: http://jsfiddle.net/jonathon/T45Nx/

Другие вопросы по тегам