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()関数の戻り値は常に initail 値 " 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 に答える