で始まるJavaScriptコードを見ましたwith
。それは少し紛らわしいです。それは何をし、どのように正しく使用できますか?
with (sObj) return options[selectedIndex].value;
で始まるJavaScriptコードを見ましたwith
。それは少し紛らわしいです。それは何をし、どのように正しく使用できますか?
with (sObj) return options[selectedIndex].value;
これは、ブロックに含まれるステートメントのスコープに追加されます。
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のドキュメントは、実際には、物事をもう少し詳細に説明するのにかなり良い仕事をしています(それを使用することの賛否両論とともに):
このwith
ステートメントは純粋な構文糖衣ですが、厄介なバグを引き起こす可能性もあります。
明確にするために、有害と考えられるステートメントを参照してください。
プログラムを読むことができず、プログラムが何をするのかを確信している場合、プログラムが正しく機能することを確信することはできません。このため、この
with
ステートメントは避ける必要があります。
その中でブロックを使用すると、次のように入力する必要はありません。
sObj.options[selectedIndex].value
しかし、あなたはただ使うことができます:
options[selectedIndex].value
その同等物
return sObj.options[selectedIndex].value;
With
特定のオブジェクトのコンテキストでステートメントのブロックを発行できます。したがって、ブロック内のすべてのステートメントは、with
括弧内のオブジェクトのメンバーであると見なされます。
これにより、コードが読みやすくなる場合がありますが、変数参照はsObjまたはグローバルのいずれかである可能性があるため、あいまいさを招く可能性もあります。
パフォーマンスの問題があるため、これを使用しないことをお勧めしますが、上記の意味は次のとおりです。
オブジェクトsObj(ここではおそらくselect要素)の場合、このオブジェクトで参照されるすべての子とプロパティ(または後続の中括弧の間)は、それを親スコープとして扱います。
これは関数ではなく(編集前に質問のタイトルに示されていたように)、ステートメントです。コードサンプルが次のようにフォーマットされていると、より意味があります。
with (sObj){
return options[selectedIndex].value;
}
それが何をするかについて(出典)
withステートメントは、一連のステートメントのデフォルトオブジェクトを確立します。JavaScriptは、ステートメントのセット内の修飾されていない名前を検索して、その名前がデフォルトオブジェクトのプロパティであるかどうかを判断します。修飾されていない名前がプロパティと一致する場合、そのプロパティはステートメントで使用されます。それ以外の場合は、ローカル変数またはグローバル変数が使用されます。
つまり、コードサンプルではoptions
、がのプロパティであるかどうかが最初にチェックされますsObj
。それがoptions
参照されてsObj.options
いる場合、それ以外の場合は、名前で定義された変数について他のスコープをチェックしますoptions
ステートメントを使用することの欠点はwith
、コードを一瞥するだけでは何がアクセスされるかを知ることができないことです。この記事に示されているように、他のより良い選択肢があります
あなたの例は次のように書き直すことができます...
return sObj.options[selectedIndex].value;
...'with'ステートメントは、関連するすべてのステートメントを指定されたオブジェクトのスコープに配置します。この場合、それはかなり無意味ですが、「sObj」で多くの操作を行っていた場合は、多くの入力を節約できます。
完全に架空の例。
with (sObj)
{
if(options[selectedIndex].value < 10){
options[selectedIndex].value++;
total+ = options[selectedIndex].value;
}
}
しかし、そうは言っても、タイピングの節約はより良い方法で達成できる場合がよくあります。