【问题标题】:Problems with variable scope (JavaScript)变量范围的问题 (JavaScript)
【发布时间】:2009-04-04 21:07:32
【问题描述】:

我有以下 JavaScript(我正在使用 jQuery):

function language(language)
{
    var text = new Object();

    $.ajax({
        type: "GET",
        url: "includes/xml/languages/" + language + ".xml",
        dataType: "xml",
        success: function(xml){
            $(xml).find('text').each(function(){
                text[$(this).attr('id')] = $(this).text();
            });
        }
    });

    return true;
}

我有一个 XML 文件,然后该类正在读取该文件。 XML 文件有这样的声明:

    <text id="must_be_string">Must be a string.</text>
    <text id="must_be_number">Must be a number.</text>
    <text id="must_be_integer">Must be an integer.</text>

XML 文件被正确读取,但我遇到的问题是 text 变量似乎无法正常工作。

通过设置一些警报停止点来尝试调试,我发现这是正在发生的事情:

success: function(xml){ 内部,可以正确访问变量text。但是,该函数内部为文本分配新短语的分配并没有正确添加它。在success: 中,我可以通过alert(text['must_be_string']) 得到“必须是字符串”,但是当我离开Ajax 调用时,它总是显示“未定义”。

如果我不清楚:

var text = new Object();

$.ajax({
    type: "GET",
    url: "includes/xml/languages/" + language + ".xml",
    dataType: "xml",
    success: function(xml){
        alert(text); // Shows [object Object]
        $(xml).find('text').each(function(){
            text[$(this).attr('id')] = $(this).text();
        });
        alert(text['must_be_string']); // Shows "Must be a string."
    }
});
alert(text['must_be_string']); // Shows undefined -- this is my problem

我真的非常感谢任何帮助。请解释一下,因为我真的很想了解发生了什么。

【问题讨论】:

    标签: javascript jquery scope


    【解决方案1】:

    ajax调用的成功方法是异步调用。当您调用$.ajax 时,该方法将立即返回并尝试执行alert(text['must_be_string']);,直到将来某个时候ajax 调用成功后才会设置。

    希望这会有所帮助。

    【讨论】:

    • 感谢您指出这一点!我通过将其设为同步请求解决了我的问题,即在 $.ajax 调用中添加“async: false”。再次感谢!
    • 添加 async:false 会在等待请求完成时暂停您的 UI。你最好在成功回调中处理结果,这对程序员来说更难,但对用户来说更容易。
    【解决方案2】:

    变量“文本”位于“语言”函数的范围内。 我不确定 jQuery 是如何管理范围的,但我认为成功函数是一个不在“语言”范围内的新函数。

    'language' 在到达 return 并发送 ajax 查询时结束。但是,响应随后出现(异步)。

    尝试在“语言”之外将“文本”对象声明为全局对象

    【讨论】:

      猜你喜欢
      • 2011-04-13
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 2017-07-18
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 2021-12-04
      相关资源
      最近更新 更多