在递归JQuery/Javascript自执行函数中设置变量(轮询)

在递归JQuery/Javascript自执行函数中设置变量(轮询),javascript,jquery,variables,long-polling,self-executing-function,Javascript,Jquery,Variables,Long Polling,Self Executing Function,我需要在递归自执行JQuery脚本中设置一个带有初始值的变量tick。当我尝试运行下面的脚本时,显然tick将恢复为0,而不是JSON对象返回的值 (function poll(){ var tick = 0; setTimeout(function(){ $.ajax({ url: "/client-polling/" + tick, success: functio

我需要在递归自执行JQuery脚本中设置一个带有初始值的变量tick。当我尝试运行下面的脚本时,显然tick将恢复为0,而不是JSON对象返回的值

    (function poll(){
        var tick = 0;
        setTimeout(function(){
            $.ajax({
                url: "/client-polling/" + tick,
                success: function(data) {
                    $( "#messagestack" ).append(data[2]);
                    tick = data[0]
                },
                dataType: "json",
                complete: poll
            });
        }, 10000);
    })();
同样由于某些原因,当我声明勾选时,函数在第一次轮询之前等待整个10秒。如果我试图在函数外声明tick,页面上的所有其他脚本都会冻结

我在哪里声明tick,以便第一次调用页面时将其设置为0,然后从返回的JSON对象中获取值

更新:我花了大量有说服力的Javascript书籍和7段Douglas Crockford视频才弄清问题所在,但我没有意识到Javascript是单线程的。我已经阅读了很多其他人编写的代码,但我并没有真正想到他们的脚本通常只运行一次,然后继续下一次。我的“事件循环”阻止其他脚本运行,是的,函数本身应该在外部有变量


我最终使用了iFrames非公开的单界面应用程序,因此安全性不是一个问题,只是为了让它运行,现在我正在研究web workers未来的构建。谢谢您的回答。

为什么不在函数外设置一个变量呢

var tick = 0;
(function poll(){
    setTimeout(function(){
        $.ajax({
            url: "/client-polling/" + tick,
            success: function(data) {
                $( "#messagestack" ).append(data[2]);
                tick = data[0]
            },
            dataType: "json",
            complete: poll
        });
    }, 10000);
})();

prob是完整的回调,当ajax完成时,将再次调用poll,因此将再次调用脚本var tick=0。尝试将勾号移到外部不起作用?控制台说什么?有错误吗?我会在ajax调用中使用setInterval,这样就不会覆盖poll变量。如果你不想让函数在第一次等待10秒,那么你必须在第一次自己调用函数。由于某种原因,当变量在外部声明时,轮询在这个脚本和第二个轮询脚本中都停止。不需要在同一页上勾选变量。我是一个Javascript noob,刚刚开始写一本有说服力的Javascript书,但我需要这个脚本在我完成这本书之前就开始工作。:嗯,也许你应该试试setInterval函数?是的,这对我来说确实有效。我在Javascript的并发性方面犯了一个错误,我在上面已经提到了,但是在我解决了单线程问题之后,你的建议起了作用,我对此进行了表决。