javascript setTimeout函数超出范围

时间:2010-05-28 00:34:58

标签: javascript jquery

我正在尝试调用showUpload();从两个setTimeouts中。两者都不起作用。它似乎超出了范围,我不确定为什么。我尝试了this.showUpload()但也没有用。

 $(document).ready(function(){
            var progress_key = $('#progress_key').val();

            // this sets up the progress bar
            $('#uploadform').submit(function() {
               setTimeout("showUpload()",1500);
               $("#progressbar").progressbar({ value:0}).fadeIn();
            });


            // uses ajax to poll the uploadprogress.php page with the id
            // deserializes the json string, and computes the percentage (integer)
            // update the jQuery progress bar
            // sets a timer for the next poll in 750ms
            function showUpload() {
                $.get("/myid/videos/uploadprogress/" + progress_key, function(data) {
                    if (!data)
                        return;

                    var response;
                    eval ("response = " + data);

                    if (!response)
                        return;

                    var percentage = Math.floor(100 * parseInt(response['bytes_uploaded']) / parseInt(response['bytes_total']));
                    $("#progressbar").progressbar({ value:percentage})

                });
                setTimeout("showUpload()", 750);
            }
        });

感谢您的时间。

2 个答案:

答案 0 :(得分:2)

您似乎需要在showUpload个来电中删除setTimeout中的括号。否则,您将调用showUpload方法,而不是将其作为参数传递:

setTimeout(showUpload, 750);

答案 1 :(得分:2)

正如@Daniel所说,这应该有效:

setTimeout(showUpload, 750);

请注意,应删除引号(这就是为什么在超时用完之前不会执行的原因)。现在,您正在传递一个字符串,当超时用完时,该字符串为eval。这个eval将在不同的范围内发生,这就是您看到所遇到的问题的原因。

相反,将对showUpload函数的引用传递给setTimeout将允许您的函数稍后执行。请记住,当它运行时,它将处于不同的范围内,因此您可能会遇到其他范围问题,例如progress_key。您需要在showUpload周围创建一个闭包来捕获该参数。