奇怪的JavaScript作用域行为

奇怪的JavaScript作用域行为,javascript,jquery,scope,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,

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"
}
第一个和第二个警报显示expact值1)“de”2“en”。第三个警报显示“de”,但不应该是“en”?! 第二个警报也会在第三个警报之后弹出

有人能取悦我脑海中显而易见的虫子吗?:)


提前谢谢

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


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

不,不应该。“加载”不会等待从“someValidUrl”获取信息。相反,它会将您的内部函数推迟到以后信息可用时执行,并立即返回而无需等待。它被称为“异步”。

您正在使用AJAX。记住AJAX是异步的!这些警报只是增加了更多的混乱,因为它们可以阻止执行线程足够长的时间,让ajax响应返回。将ajax与警报调试混合使用肯定会扭曲您对所发生情况的理解。我们应该找出一些问题,因为我们每天都会多次遇到相同的问题。@user1494845:也许您应该考虑一下为什么要将函数传递给
.load
。如果“de”警报将向“en”发出警报,则没有理由传递函数。您可以使用
.load
的“返回值”,或者至少去掉整个函数-但由于异步概念,这是不可能的,因此您首先要传递一个函数!。。。或使用(或其等价物)代替。。。。或者使用同步请求。(将async设置为false:)编辑:不要这样做。@roman-不要这样做。从jQuery1.8开始,它将被弃用。@James,噢!我没看见that@raina77ow-非常正确,但这需要更改
$.get
$.ajax
,因为
.load()
返回jQuery的实例,而不是
jqXHR