2

这是我的代码。

我发送ajax请求并返回值的函数:

function myAjaxCall(){
   var myValue=0
   var async= false //I have to use synchronized request(otherwise my return value is 0)
   xmlhttp.open("GET",URL,async);

   xmlhttp.onreadystatechange=function(){
       ...
       myValue = SOMEVALUE;
   };

   xmlhttp.send();         

   return myValue
}

我的其他函数将使用 myAjaxCall 函数返回值

function otherFunc(){
   var x= myAjaxCall();
}

除了在Firefox浏览器上,一切都以这种方式完美运行,我知道原因是因为在 Firefox 中,如果我使用同步请求,onreadystatechange将不会被调用。

但是,在我的情况下,我必须使用同步的ajax 请求,否则myAjaxCall()函数返回的值始终是初始值“ var myValue=0”。

如何摆脱这个Firefox问题?

4

1 回答 1

3

使用函数指针而不是内联函数来避免这个问题:

function myAjaxCall(){
   var myValue=0;
   var async= true;

   xmlhttp.open("GET",URL,async);
   xmlhttp.send();
   xmlhttp.onreadystatechange=foo;         
  }

function foo(bar)
  {
  var myValue = SOMEVALUE;
  return myValue;
  }

JavaScript 中的函数控制范围,因此:

  • 匿名函数创建一个新的作用域,而被引用的函数在全局作用域中
  • 将函数移出范围可避免命名空间冲突
  • myValue 在新范围内继承一个值,但不在全局范围内

另外,发送应该在 onReadyStateChange 之前完成

于 2012-10-11T06:07:51.337 回答