JavaScript 变量作用域

2024-04-30

我遇到了 JavaScript 全局变量(称为 TimeStamp)未在加载时定义的问题...至少我认为这就是问题所在。

我从这里开始,定义时间戳。

        $(document).ready(function(){
        // AddTest();
        var TimeStamp = null;
        waitForMsg();
    });

...waitForMsg 然后使用 TimeStamp 运行并在成功完成 ajax 调用时更新它。至少这是这个想法,但目前没有任何运行,因为“时间戳未定义”......即使我之前定义了它! (呃)。

如果我在 waitForMsg 中重新定义时间戳,它只会被重置,而不是使用成功的 ajax 函数中的更新值。

    function waitForMsg(){


    $.ajax({
        type: "POST",
        url: "backend.php",
        async: true,
        cache: false,
        timeout:50000, /* Timeout in ms */
        data: "TimeStamp=" + TimeStamp,
        success: function(data){

            var json = eval('(' + data + ')');

            $('#TextHistory :last-child').after('<p>' + json['msg'] + '</p>');


            TimeStamp = json['timestamp'];


            setTimeout(
                'waitForMsg()', /* Request next message */
                1000            /* ..after 1 seconds */
            );
        },
        error: function(XMLHttpRequest, textStatus, errorThrown){

            $('#TextHistory :last-child').after('<p>' + errorThrown + '</p>');

            setTimeout(
                'waitForMsg()', /* Try again after.. */
                "15000");       /* milliseconds (15seconds) */
        },
    });
};

一如既往,我们非常感谢任何帮助。

Dan.


change

$(document).ready(function(){
    // AddTest();
    var TimeStamp = null;
    waitForMsg();
});

to

var TimeStamp = null;
$(document).ready(function(){
    // AddTest();
    waitForMsg();
});

这样,它将存在于全局范围内,而不仅仅是就绪函数的范围内。

进一步说明,您应该更改您的setTimeout表格中的陈述setTimeout(string to eval,delay) to setTimeout(function reference to run, delay)。像这样:

setTimeout(waitForMsg,1000);

这样你就可以避免不必要的事情eval call.

此外,考虑改变

var json = eval('(' + data + ')');

to

var json = JSON && JSON.parse ? JSON.parse(data) : eval('(' + data + ')');

这样您就可以在现代浏览器中受益于本机 JSON 解析。

更好的是,让 jQuery 通过添加来反序列化 JSONdataType: 'json'作为 ajax 调用的参数:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 变量作用域 的相关文章

随机推荐