奇怪的JavaScript作用域行为
Latey我遇到了一些奇怪的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,
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
。