setTimeout不起作用

Jas*_*ack 5 javascript jquery owl

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

$(document).ready
Run Code Online (Sandbox Code Playgroud)

function visualize (file) {
if (!file)
    {setTimeout(visualize(file), 2000)}
else
    {jQuery(function($){visFeaturePool.init(file)})}}
Run Code Online (Sandbox Code Playgroud)

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

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

T.J*_*der 36

代替

// #1
setTimeout(visualize(file), 2000);
Run Code Online (Sandbox Code Playgroud)

你要

// #2
setTimeout(function() {
    visualize(file);
}, 2000);
Run Code Online (Sandbox Code Playgroud)

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

// #3
setTimeout(visualize, 2000, file);
Run Code Online (Sandbox Code Playgroud)

这三个解释说:

  1. (正如SLaks所提到的)这会visualize 立即调用,然后将其返回值传递给setTimeout(并且自从visualize调用本身以来,它一直以递归方式调用自身,最终导致堆栈溢出错误).
  2. 这会将函数引用传递给setTimeout它,在调用时,将调用visualize并传递file参数.我们传入的函数setTimeout将有权访问file参数,即使您的代码已经运行并返回,因为该函数是创建它的上下文的闭包,其中包括file.更多:关闭并不复杂
  3. 这将visualize函数引用传递给setTimeout(注意我们没有()(file)在它之后)并且也传递filesetTimeout(延迟之后).在现代浏览器上,setTimeout稍后调用它时会将其传递给函数.

(#2和#3之间有一个重要的区别:对于#2,如果filesetTimeout调用和定时器到期之间改变,visualize则会看到file新的值.但是,#3,它不会.两者都有它们的用途.)