1

私は次のパターンを見て、それを自分の用途に適合させてみました。

var request = window.ActiveXObject ?
  new ActiveXObject('Microsoft.XMLHTTP') :
  new XMLHttpRequest;

簡略化:

var request = window.ActiveXObject ?
  "is ActiveX" : "not ActiveX";
document.write(request + "<br>");
// I get not ActiveX (Chrome)

今私が試してみると:

var notX = "x"; 
  var j = x ? "has x" : "no x";
  document.write(j + "<br>");
  // console error: x is not defined

http://jsfiddle.net/4mn8n/1/

何も出力されません。プログラムが継続しているが、そうではないことと何がwindow.ActiveXObject違うのですか?xdocument.writex

- さらに重要なことには

上記を置き換えるために使用できる堅牢なパターンは何ですか?

4

2 に答える 2

2

変数とプロパティには大きな違いがあります(変数は常に何らかのオブジェクトのプロパティですが、そのオブジェクトに名前がなく、関数を呼び出すときに使用される変数バインディングオブジェクトなど、オブジェクトに直接アクセスする方法がない場合もあります)。あなたがするとき:

if (thingy.x) {
    // ...
}

...プロパティをチェックしています。プロパティが存在しない場合、それはエラーではなく、返される値がであるということだけですundefined

対照的に、次の場合:

if (x) {
    // ...
}

...という名前の変数xをチェックしています。xがまったく存在しない場合は、シンボルが完全に定義されていないため(を持つプロパティではなく) 、エラー(具体的にはa )になります。ReferenceErrorx undefined

windowグローバル変数はブラウザにあるグローバルオブジェクトのプロパティであるため、グローバル変数を扱う場合、これは少し曖昧になります。だからあなたが持っているなら:

var x;

...グローバルスコープでは、は(グローバルオブジェクト)のプロパティであるためif (x)、同様に機能します。ただし、大きな違いがあります。定義されていない場合、エラーがスローされますが、falseになります(式の結果が)になるためです。if (window.x)xwindowxif (x)if (window.x)window.xundefined

グローバルスコープは、ステートメントを使用しない限り、これが発生する唯一のスコープです( Crockfordがここで説明withしている理由から、これは避けることをお勧めします)。(私は常にCrockfordに同意するわけではありません。実際、それは50%に過ぎないと言うでしょうが、彼には良い点があります。)with

未定義の参照であっても、任意の参照で確実に使用できるため、次のようになります。typeof

if (typeof x !== "undefined") {
}

...x完全に定義されていない場合でも機能するため、通常、何かが存在するかどうかを確認するための最良の方法です。

于 2012-04-29T22:14:49.253 に答える
1

未定義の変数をそのまま使用してチェックすると、エラーになります。元のコードはオブジェクトのプロパティとしてアクセスしているため、エラーは発生しません。windowエラーではなく、未定義のプロパティをフェッチするとundefined、JavaScriptが生成されます。

変数を確認するには、typeof代わりにを使用できます。

var j = typeof x !== 'undefined' ? "has x" : "no x";
于 2012-04-29T22:11:15.893 に答える