setTimeout不起作用

时间:2011-12-04 14:27:52

标签: javascript jquery owl

我想在执行其他(可视化)脚本之前加载OWL文件。为此,我尝试了

中的所有内容
$(document).ready

function visualize (file) {
if (!file)
    {setTimeout(visualize(file), 2000)}
else
    {jQuery(function($){visFeaturePool.init(file)})}}

我认为必须使用setTimeout,但这不起作用。我抛出错误: 未捕获的RangeError:超出了最大调用堆栈大小,因此它不会等待,它只是调用可视化函数,直到堆栈已满。

有人知道我做错了什么吗? 谢谢!

4 个答案:

答案 0 :(得分:34)

而不是

// #1
setTimeout(visualize(file), 2000);

你想要

// #2
setTimeout(function() {
    visualize(file);
}, 2000);

或在现代浏览器中,您可以提供在延迟后传递给函数的参数:

// #3
setTimeout(visualize, 2000, file);

这三个人解释说:

  1. (正如SLaks所提到的)这会立即调用visualize ,然后将其返回值传递给setTimeout(并且由于visualize调用自身,它会一直调用本身是递归的,你最终会遇到堆栈溢出错误。)
  2. 这将函数引用传递给setTimeout,在调用时,将调用visualize并将file参数传递给它。我们传递给setTimeout的函数将有权访问file参数,即使您的代码已经运行并返回,因为该函数是上下文中的闭包创建它,包括file。更多:Closures are not complicated
  3. 这将visualize函数引用传递给setTimeout(注意我们之后没有()(file))并将file传递给{ {1}}(延迟之后)。在现代浏览器中,setTimeout会在稍后调用它时将其传递给函数。
  4. (#2和#3之间存在重要差异:对于#2,如果在调用setTimeout和计时器到期之间更改file,则setTimeout会看到visualize 1}}的新价值。但是,#3,它不会。两者都有它们的用途。)

答案 1 :(得分:3)

setTimeout(visualize(file), 2000)立即调用visualize 并将结果传递给setTimeout,就像任何其他函数调用一样。

答案 2 :(得分:1)

试试这个:

function visualize (file) {
  if (!file)
    {setTimeout(function(){visualize(file);}, 2000)}
  else
    {jQuery(function($){visFeaturePool.init(file)})}}

通过这种方式,您可以为setTimeout提供一个匿名函数,该函数将在计划时执行,您可以使用类似file的闭包传递参数以进行可视化。

答案 3 :(得分:0)

same origin policy

也可以。