質問

私はそのようなものを考えています with(Math){document.body.innerHTML= PI} 正確には良い練習ではないでしょう。

役に立ちましたか?

解決

スコープチェーンにどのように影響するかを考えると、私はそれを悪い練習と呼びます。

ダグラス・クロックフォードのこの記事を見てください:」声明が有害と見なされています"

他のヒント

マットの答えのリンクの短い要約は、「with」ステートメントを使用することの問題は、「with」のブロック内の変数が曖昧であるということです。次の例を使用してください。

with(foo.doo.diddly.doo){
  bar = 1;
  baz = 1;
}

foo.doo.diddly.dooがバーまたはBazのプロパティを持っていることを絶対に確信していない場合、声明の中のバーとBazが実行されているのか、それともいくつかのグローバルなバーとBazが実行されているかどうかはわかりません。変数を使用する方が良いです。

var obj = foo.doo.diddly.doo;

obj.bar = 1;
obj.baz = 1;

ただし、あなたの例では、数学は変数を使用することさえ正当化するのに十分な長い用語ではありませんが、質問に使用したよりも冗長なアプリケーションを念頭に置いていると思います。

(ネストされた)オブジェクトプロパティに一度アクセスすると、「キャッシュ」する必要はありません。

ただし、1回以内にアクセスする場合は、ローカル変数に参照を保存する必要があります。これには2つの利点があります。

  1. (ネストされた)プロパティは、1回以上検索する必要はありません(潜在的に継承チェーンで遅い!)。
  2. 特にグローバルオブジェクト(ただし、現在の範囲にないオブジェクト)は調べるだけでよいです 一度 スコープチェーンで。後続のアクセスはより速くなります。

そして今、とのつながり with:

現在のスコープチェーンの開始時に新しいスコープを生成します。つまり、他の変数/オブジェクトへのアクセスは、関数にローカルな変数に対してさえ、少なくとも1つのスコープ検索のコストがかかります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top