为什么这个javascript函数没有定义?

时间:2011-07-26 20:59:31

标签: javascript jquery debugging undefined

我有这个javascript代码:

$(function(){
  var currentCarouselItem = 1; //set carousel to first slide
  var runCarousel = 1;

  $(window).load(function(){    
    setTimeout('autoScroll()', 10000);
  });

  function autoScroll(num){
    if (runCarousel == 1) {
      $('.carouselItem.' + currentCarouselItem).animate({left: '975px'}, 'slow', function(){
        $(this).removeClass('active');
        $(this).attr('style','');
        var nextItem = currentCarouselItem + 1;
        if (nextItem == 7) {
            nextItem = 1;
        }
        $('.carouselItem.' + nextItem).animate({left: '110px'}, 'slow', function(){
          $(this).addClass('active');
        })
      })
    }   
  }
})

每当我运行网站时,它都会抛出一个控制台错误:Uncaught ReferenceError: autoScroll is not defined

知道它为什么认为没有定义?

6 个答案:

答案 0 :(得分:4)

setTimeout('autoScroll()', 10000);

为什么要把它放在引号中?

setTimeout(autoScroll, 10000);

那是初学者。

此外,您在这里遇到了范围问题。

答案 1 :(得分:3)

我可以尝试为你解答,但我认为这个人做得更好:

JQuery, setTimeout not working

答案 2 :(得分:1)

我认为这是因为你的autoScroll函数是由最外层$(function(){})创建的封闭内部。因此,eval(用于评估setTimeout中的字符串)无法找到它,因为它在“全局”范围内运行。

您可以将autoScroll的定义移到外面。

另外,如 jcolebrand 所示,请删除引号。

答案 3 :(得分:1)

我认为这是因为当你传递一个字符串作为setTimeout()的第一个参数时,javascript基本上从该字符串的全局范围运行eval()autoScroll生活在$(function() { })范围内,因此无法从全球范围内“看到”。

尝试将其更改为setTimeout(autoScroll, 10000);

答案 4 :(得分:1)

您的代码存在一些问题,但autoScroll函数未定义的原因是它在文档就绪函数的范围内定义,但是在eval之后执行如果没有适当的关闭,文件已经超出了范围。

答案 5 :(得分:0)

$('.carouselItem.' + currentCarouselItem).animate({left: '975px'}, 'slow', function(){
                $(this).removeClass('active');
                $(this).attr('style','');
                var nextItem = currentCarouselItem + 1;
                if (nextItem == 7) {
                    nextItem = 1;
                }
                $('.carouselItem.' + nextItem).animate({left: '110px'}, 'slow', function(){
                    $(this).addClass('active');

                });
            });

对于初学者,你需要在这样的函数结尾处使用半冒号