0

私は DOM スクリプトに関する本を読んでいますが、Ajax について話しているときに次の関数が本に出てきます。

function getHTTPObject() {

    if(typeof XMLHTTPRequest == "undefined")
        XMLHTTPRequest = function() {
           try { return new ActiveXObject("Msxml2.XMLHTTP.6.0");}
           catch(e) {}

           //several more fall through try/catch blocks attempting 
           //to create different XMLHTTP objects. 
           //If none succeed...

           return false;
        }

     return new XMLHTTPRequest();
}

XMLHTTPRequest に割り当てられた内部匿名関数内で ActiveXObject を作成しようとするときに、try/catch ブロック内で new キーワードが使用されている場合、getHTTPObject() の最後で XMLHTTPRequest の結果を返すときに new キーワードが再び使用されるのはなぜですか?

新しい、新しいオブジェクトを返しているようです。

編集

XMLHTTPRequest コンストラクターが存在するかどうかを確認し、存在しない場合は XMLHTTP ActiveXObjects を作成しようとするコンストラクターを定義するというコードの目的を広く理解しています。ここまで一緒です。

XMLHTTPRequest が未定義であるとします。

XMLHTTPRequest には内部関数コンストラクターが割り当てられます。

次に、getHTTPRequest の下部で XMLHTTPRequest が呼び出されます。

XMLHTTPRequest 内で、新しい ActiveXObject が作成され、呼び出し元 (この場合は getHTTPObject) に返されます。今度は getHTTPObject がこのオブジェクトを呼び出し元に返します。しかし、繰り返しますが、なぜ行は次のようになります:

return new XMLHTTPRequest() 

XMLHTTPRequest() の定義/スコープ内のその try ブロックのコード内で new (つまり、オブジェクトのインスタンス化) が既に発生している場合、そこに new が必要ですか? なぜ単純ではないのですか:

return XMLHTTPRequest()

答えてくれてありがとう。おそらく、私が JS コンストラクターの構文を十分に理解していない可能性が非常に高く、それが私をここでつまずかせている原因です。

4

5 に答える 5

1

あなたが言及したtryブロックは、if条件が満たされた場合にのみ実行されます

if(typeof XMLHTTPRequest == "undefined")

そうでない場合は、メソッドの最後の return ステートメントにgetHTTPObject()直接到達し、新しいXMLHTTPRequestオブジェクトを返します。

そのため、newActiveXObjectまたは newのいずれかXMLHTTPRequestが返されます。

于 2012-10-12T03:39:41.713 に答える
1

Return はすぐに発生し、コード ブロックを終了します。それらのリターンの1つだけがヒットします。

于 2012-10-12T03:29:11.507 に答える
1

あなたはコードを誤解しています。

> function getHTTPObject() {
> 
>     if(typeof XMLHTTPRequest == "undefined")
>         XMLHTTPRequest = function() {

識別子XMLHTTPRequestが定義されていない場合は、次の関数を割り当てます。

>            try { return new ActiveXObject("Msxml2.XMLHTTP.6.0");}
>            catch(e) {}
> 
>            //several more fall through try/catch blocks attempting 
>            //to create different XMLHTTP objects. 
>            //If none succeed...
> 
>            return false;
>         }

ここで、ホストが提供する関数または上記で割り当てられた関数である XMLHttpRequest を呼び出します。

>      return new XMLHTTPRequest(); }

上記は、識別子 XMLHttpRequest が未定義以外のものに解決された場合、それは呼び出し可能であり、XMLHttpRequestインスタンスを返すと想定しています。

于 2012-10-12T03:42:29.687 に答える
0

JavaScript では、コンストラクターから別のオブジェクトを返すことができます。コンストラクターは次のように定義されています。

XMLHTTPRequest = function() {
       try { return new ActiveXObject("Msxml2.XMLHTTP.6.0");}

成功した場合、結果のオブジェクトは、コンストラクターとしてnew ActiveXObject("Msxml2.XMLHTTP.6.0")呼び出した呼び出し元に返されます。XMLHTTPRequest

    return false;

はオブジェクト自体ではないXMLHTTPRequestため、このステートメントはタイプの空のオブジェクトを返すだけです。false

最後getHTTPObject()に、コンストラクターだけでなく、オブジェクトを返す必要があります。これがreturn new XMLHTTPRequest();、最後に表示される理由です。

ECMAScript 言語仕様のこの動作のドライ バージョンも参照してください。

于 2012-10-12T03:47:58.517 に答える
0

内部コンストラクターは、外部コンストラクターの前に呼び出されません。代わりに、XMLHTTPRequest 関数が存在しない場合は最初に定義され、次にコンストラクターとして呼び出されます。

最初に XMLHTTPRequest が存在するかどうかをチェックします (ネイティブのもの、または以前の呼び出しからのいずれか)。存在する場合は、コンストラクターとして呼び出されます。存在しない場合は、最初に作成されます。

ここでのトリックの 1 つは、コンストラクターがオブジェクトを返す場合、そのnewオブジェクトは割り当てられたものではなく、返されたものであるということです。通常、これにより即時のガベージ コレクションが発生します。賢いインタープリターは、割り当てがまったく必要ないことに気付くかもしれません。これは、新しく作成されたコンストラクターが行うことです - 別のオブジェクトを返します。( http://www.gibdon.com/2008/08/javascript-constructor-return-value.htmlを参照)

作成された XMLHTTPRequest は、ブラウザーの XMLHTTPRequest を置き換えます。ブラウザー独自の XMLHTTPRequest コンストラクターは関数として呼び出すことができず、コンストラクターとして呼び出す必要があります。そのため、新しく作成されたオブジェクトもコンストラクターとして呼び出す必要があります。


これは通常、正しい AJAX オブジェクトを選択するためのライブラリまたはjQueryなどのツールキットの仕事であることに注意してください。

于 2012-10-12T03:42:18.233 に答える