ものは何か"といJavaScript?
-
22-09-2019 - |
質問
見たJavaScriptコードを始めとする with
.ことになるビット混乱している。どのような方は使用できるのを確認してください。◆
with (sObj) return options[selectedIndex].value;
解決
これは、ブロックに含まれるステートメントの範囲に追加します:
return sObj.options[selectedIndex].value;
になることができます:
with (sObj)
return options[selectedIndex].value;
あなたのケースでは、それは全体の多くを行う...しかし、次のことを考慮しdoens'tます:
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のドキュメントは、実際に(それを使用しての長所と短所と一緒に)もう少し詳細に物事を説明するのはかなり良い仕事をします:
他のヒント
with
文は純粋な構文糖であるが、それはまた、いくつかの厄介なバグを引き起こす可能性があります。
明確化のために有害を考慮声明でを参照してください。 :
あなたがプログラムを読んで、あなたはそれを行うために何が起こっているか知っていることを確信することができない場合は、、あなたは正しく機能するために起こっているという確信を持つことができません。このため、
with
文は避けるべきである。
そのではブロックで次のように入力する必要がいけない。
sObj.options[selectedIndex].value
しかし、あなたは、単に使用することができます:
options[selectedIndex].value
その
の同等return sObj.options[selectedIndex].value;
With
は、あなたが特定のオブジェクトのコンテキストでステートメントブロックを発行することができます。従って全てwith
ブロック内のステートメントのカッコ内のオブジェクトのメンバーであると解釈されます。
これはを、時にはコードをより読みやすくすることができますが、のそれはまた、変数の参照はどちらかSOBJまたはグローバルとすることができるため、あいまいさにつながることができます。
思いをこめ性能の問題が、どのようには:
オブジェクト sObj (ここではそのselect要素)、すべての児童の性質を参照すること(または間に以下の巻きブレース)取り扱いとその親会社です。
あなたの例では、...
のように書き換えることができreturn sObj.options[selectedIndex].value;
声明「は」...として供給されたオブジェクトのスコープ内のすべての関連のステートメントを配置します。この場合、それはそれは入力の手間を節約し、あなたが「SOBJ」上の操作の多くをやっていたならば、かなり無意味だけど。
完全に架空の例..
with (sObj)
{
if(options[selectedIndex].value < 10){
options[selectedIndex].value++;
total+ = options[selectedIndex].value;
}
}
しかしは、それが保存タイピングがより良い方法で達成することができることが多い場合だ、と述べた。
これは、関数(それが編集された前のように質問のタイトルに示された)が、声明ではありません。コードサンプルはそうのようにフォーマットされている場合にはより多くの意味を行うことがあります:
with (sObj){
return options[selectedIndex].value;
}
それは(ソースの)何をするかについて
ステートメントを使用してステートメントのセットのためのデフォルトのオブジェクトを設定します。 JavaScriptは名前がデフォルトのオブジェクトのプロパティであるかどうかを判断するために文のセット内の任意の非修飾名を検索します。非修飾名は、プロパティと一致する場合、そのプロパティは声明の中で使用されています。そうでない場合は、ローカルまたはグローバル変数が使用されます。
options
はsObj
のプロパティがある場合のサンプルコードでは、それが最初にチェックされることを意味します。それは次にoptions
sObj.options
を指している場合、そうでない場合は、名前options
with
ステートメントを使用しての欠点は、それだけでアクセスしますどのようなコードを一瞥から知ることは不可能であるということです。 この記事に示すように、他のより良い選択肢があります