奇怪的JavaScript范围行为

Oli*_*ver 0 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"
}
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢!

Jam*_*ice 8

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

或者,您可以查看jQuery延迟对象API.请注意,如果您要使用延迟对象API,则需要更改load调用jQuery.get或调用jQuery.ajax,因为.load返回一个jQuery实例,该实例未实现Promise接口.

  • ...或者使用[.then()](http://api.jquery.com/deferred.then/)(或其等价物)代替. (3认同)