奇怪的JavaScript范围行为

时间:2012-07-06 12:59:05

标签: javascript jquery scope

Latey我遇到了一些奇怪的javascript行为的麻烦。我想做这样的事情:

var lang = null;

function getLang() {
    if (browserLanguageIsGerman) {
        lang = 'de';
    }
    else {
        lang = 'en';
    }
    // alert(lang) shows "de"

    $('#someID').load(someValidUrl, null, 
        function(response, status, xhr) {
            if(languageSettingsOnFacebookIsGerman) {
                lang = 'de';
            }
            else {
                lang = 'en';
            }
            // alert(lang) show "en"
    );
    // alert(lang) shows "de"
}

第一个和第二个警报显示已过期的值1)“de”2)“en”。第三个警报显示“de”但不应该是“en”?! 第三个警报后,第二个警报也会弹出。

有人可以在我脑海中明显出现错误吗? :)

提前致谢!

2 个答案:

答案 0 :(得分:8)

这不是范围问题。 load方法是异步的。第三个alert在您传递给load的回调之前执行。将依赖于该异步调用结果的任何代码移动到回调中。

或者,您可以查看jQuery deferred objects API。请注意,如果您要使用延迟对象API,则需要将呼叫更改为load来调用jQuery.getjQuery.ajax,因为.load会返回jQuery,它没有实现Promise接口。

答案 1 :(得分:0)

不,不应该。 “load”不等待来自“someValidUrl”的信息将被提取。相反,它会推迟您的内部函数,以便稍后执行,当信息可用时,立即返回而无需等待。它被称为“异步”。