2010-09-20 35 views
4

setTimeout问题“功能未定义”!setTimeout问题“功能未定义”!

这段代码有什么问题?

$(document).ready(function(){ 

function ISS_NextImage() { //ImageSlideShow NextImage 
    $('.ImageSlideShow').each(function() { 
    alert($(".correntImage", this).text()); 
    }); 
} 

var t=setTimeout("ISS_NextImage();",1000); 

}); 

回答

11

当您的代码为eval时,它在全局范围内完成。由于您尝试调用的函数在本地范围内,因此失败。

传递函数来setTimeout而不是传递的字符串是eval编辑。

var t=setTimeout(ISS_NextImage,1000); 
+2

*“当你的eval代码,它在全球完成范围“* **排序**(其中存在其中一个问题。)setTimeout发生的范围与发生”eval“的范围不同。这不会改变您不使用字符串的基本建议的智慧,而是函数引用。 – 2010-09-20 21:43:21

1

避免将字符串传递给setTimeout()。只是传递给函数的引用来代替:

var t = setTimeout(IIS_NextImage, 1000); 
0

你还可以:

$(function() { 
    var t = setTimeout(new function() { 
     $('.ImageSlideShow').each(function() { 
      alert($(".correntImage", this).text()); 
     }); 
    }, 1000); 
}); 
+0

你可以,但它会让阅读变得更难,而使用'new'关键字的选择是......奇怪的。 – Quentin 2010-09-20 21:47:19

3

试着改变你设定的超时调用此:

var t=setTimeout(function(){ISS_NextImage();},1000); 
+0

这是几分钟前已经说过的和其他人已经说过的。 – 2010-09-20 21:46:20

+0

除了调用不带参数的不同函数之外,什么都不做的函数通常是一个坏主意。 – Quentin 2010-09-20 21:47:48

+0

@David - 但是如果你确实想用'ISS_NextImage()'来包含参数,那么这就是要走的路......而且这对下一个图像函数来说很常见,因为你可能想要做一些事情像'var t = setTimeout(function(){ISS_NextImage((imageIndex + 1)%numImages);},1000);' – 2010-09-21 00:47:19

0

你可以做这样的事情:

$(document).ready(function(){ 
    setTimeout(ISS_NextImage,1000); 
}); 

function ISS_NextImage() { 
    $('.ImageSlideShow').each(function() { 
     alert($(".correntImage", this).text()); 
    }); 
}