私は、そのようなものwith(Math){document.body.innerHTML= PI}
は正確には良い習慣ではないと思っています。
3 に答える
それがスコープチェーンにどのように影響するかを考えると、これは悪い習慣と言えます。
ダグラス・クロックフォードからのこの記事を見てください:「有害であると考えられる声明とともに」
Mattの回答のリンクの簡単な要約は、「with」ステートメントの使用に関する問題は、「with」のブロック内の変数があいまいであるということです。次の例を使用します。
with(foo.doo.diddly.doo){
bar = 1;
baz = 1;
}
foo.doo.diddly.dooにbarまたはbazプロパティがあるかどうかが完全にわからない場合は、withステートメント内のbarとbazが実行されているのか、グローバルなbarとbazが実行されているのかわかりません。変数を使用することをお勧めします。
var obj = foo.doo.diddly.doo;
obj.bar = 1;
obj.baz = 1;
あなたの例では、数学は変数を使用しても正当化するのに十分な長さではありませんが、質問に使用したよりも詳細なアプリケーションを念頭に置いていると思います。
(ネストされた)オブジェクトプロパティに一度アクセスすると、それらを「キャッシュ」する必要はありません。
ただし、それらに複数回アクセスする場合は、参照をローカル変数に格納する必要があります。これには2つの利点があります。
- (ネストされた)プロパティは、何度もルックアップする必要はありません(継承チェーン内で遅い可能性があります!)。
- 特にグローバルオブジェクト(ただし、現在のスコープにないオブジェクト)は、スコープチェーンで一度だけ検索する必要があります。その後のアクセスはより高速になります。
そして今、への接続with
:
現在のスコープチェーンの開始時に新しいスコープを生成します。つまり、他の変数/オブジェクトへのアクセスは、関数に対してローカルな変数であっても、少なくとも1つのスコープルックアップのコストが高くなります。