19

で始まるJavaScriptコードを見ましたwith。それは少し紛らわしいです。それは何をし、どのように正しく使用できますか?

with (sObj) return options[selectedIndex].value;
4

8 に答える 8

22

これは、ブロックに含まれるステートメントのスコープに追加されます。

return sObj.options[selectedIndex].value;

になることができる:

with (sObj)
    return options[selectedIndex].value;

あなたの場合、それはそれほど多くのことをしません...しかし、次のことを考慮してください:

var a, x, y;
var r = 10;
a = Math.PI * r * r;
x = r * Math.cos(PI);
y = r * Math.sin(PI /2);

になる:

var a, x, y;
var r = 10;
with (Math) {
  a = PI * r * r;
  x = r * cos(PI);
  y = r * sin(PI / 2);
}

...いくつかのキーストロークを節約します。Mozillaのドキュメントは、実際には、物事をもう少し詳細に説明するのにかなり良い仕事をしています(それを使用することの賛否両論とともに):

と-MozillaDeveloperCenter

于 2010-03-29T13:56:52.837 に答える
10

このwithステートメントは純粋な構文糖衣ですが、厄介なバグを引き起こす可能性もあります。

明確にするために、有害と考えられるステートメントを参照してください。

プログラムを読むことができず、プログラムが何をするのかを確信している場合、プログラムが正しく機能することを確信することはできません。このため、このwithステートメントは避ける必要があります。

于 2010-03-29T13:59:37.593 に答える
2

その中でブロックを使用すると、次のように入力する必要はありません。

sObj.options[selectedIndex].value

しかし、あなたはただ使うことができます:

options[selectedIndex].value
于 2010-03-29T13:57:43.827 に答える
2

その同等物

return sObj.options[selectedIndex].value;

With特定のオブジェクトのコンテキストでステートメントのブロックを発行できます。したがって、ブロック内のすべてのステートメントは、with括弧内のオブジェクトのメンバーであると見なされます。

これにより、コードが読みやすくなる場合がありますが、変数参照はsObjまたはグローバルのいずれかである可能性があるため、あいまいさを招く可能性もあります

javascriptの「with」ステートメントの正当な使用法:D

于 2010-03-29T13:57:56.730 に答える
1

パフォーマンスの問題があるため、これを使用しないことをお勧めしますが、上記の意味は次のとおりです。

オブジェクトsObj(ここではおそらくselect要素)の場合、このオブジェクトで参照されるすべての子とプロパティ(または後続の中括弧の間)は、それを親スコープとして扱います。

于 2010-03-29T13:57:16.940 に答える
1

これは関数ではなく(編集前に質問のタイトルに示されていたように)、ステートメントです。コードサンプルが次のようにフォーマットされていると、より意味があります。

with (sObj){
    return options[selectedIndex].value;
}

それが何をするかについて(出典

withステートメントは、一連のステートメントのデフォルトオブジェクトを確立します。JavaScriptは、ステートメントのセット内の修飾されていない名前を検索して、その名前がデフォルトオブジェクトのプロパティであるかどうかを判断します。修飾されていない名前がプロパティと一致する場合、そのプロパティはステートメントで使用されます。それ以外の場合は、ローカル変数またはグローバル変数が使用されます。

つまり、コードサンプルではoptions、​​がのプロパティであるかどうかが最初にチェックされますsObj。それがoptions参照されてsObj.optionsいる場合、それ以外の場合は、名前で定義された変数について他のスコープをチェックしますoptions

ステートメントを使用することの欠点はwith、コードを一瞥するだけでは何がアクセスされるかを知ることができないことです。この記事に示されているように、他のより良い選択肢があります

于 2010-03-29T13:57:30.750 に答える
1

あなたの例は次のように書き直すことができます...

return sObj.options[selectedIndex].value;

...'with'ステートメントは、関連するすべてのステートメントを指定されたオブジェクトのスコープに配置します。この場合、それはかなり無意味ですが、「sObj」で多くの操作を行っていた場合は、多くの入力を節約できます。

完全に架空の例。

with (sObj) 
{
   if(options[selectedIndex].value < 10){
       options[selectedIndex].value++;
       total+ = options[selectedIndex].value;
   }
}

しかし、そうは言っても、タイピングの節約はより良い方法で達成できる場合がよくあります。

于 2010-03-29T14:00:03.413 に答える
0

それはあなたと他の人の間に痛みと苦しみをもたらします

于 2010-03-29T14:20:42.240 に答える