Visit Mozilla.org

Core JavaScript 1.5 Reference:Statements:with

出典: MDC



目次

[編集] 概要

文に対するスコープチェーンを拡張します。

Statement
実装されたバージョン: JavaScript 1.0, NES 2.0
ECMA バージョン: ECMA-262

[編集] 構文

with (object)
  statement

[編集] パラメータ

object 
文を評価するときに使われるスコープチェーンに、与えられたオブジェクトを追加します。オブジェクトの周りの括弧は必須です。
statement 
任意の文。複数の文を実行するためには、それらの文をグループ化するためにブロック文 ({ ... }) を使ってください。

[編集] 説明

JavaScriptは、スクリプトの実行コンテキストまたは非修飾名を含む関数の実行コンテキストに関連付けられたスコープチェーンを探索することにより、非修飾名を探します。'with' 文は、その文本体の評価の間、このスコープチェーンの先頭に、与えられたオブジェクトを追加します。もし本体で使われた非修飾名がそのスコープチェーンの中のプロパティに一致するなら、その名前はそのプロパティとそのプロパティを含むオブジェクトとに結び付けられます。そうでなければ、'ReferenceError' が投げられます。

注意: Firefox 1.5 は、'with' 文が使われたときに、"deprecated with statement usage" という警告を出します。これは Firefox 1.5.0.1 で削除されました (bug 322430)。

パフォーマンスの利点と欠点

  • 利点: 'with' は、パフォーマンスの悪化なしに、長ったらしいオブジェクトの参照を繰り返す必要性を減らすことにより、ファイルサイズの削減に役立ちます。'with' により必要とされるスコープチェーンの変更は、計算コストが高いものではありません。'with' の使用は、インタプリタが、繰り返されるオブジェクトの参照を解析するのを楽にするでしょう。しかしながら、多くの場合では、これによる利益は、望むオブジェクトへの参照を保存するための一時的な変数を使うことにより達成されるということに注意してください。
  • 欠点: 'with' は、すべての非修飾名の検索に対して、指定されたオブジェクトが最初に探索されることを強制します。それゆえに、関数の仮引数および宣言されたローカル変数名に一致するすべての識別子は、'with' ブロックの中では見つかるのがより遅くなるでしょう。パフォーマンスが重要な場所では、'with' は、関数の引数および宣言されたローカル変数の識別子を使わないコードブロックを包み込むためだけに使われるのが適切でしょう。

あいまい性の欠点

  • 欠点: 'with' は、非修飾名がスコープチェーンの中で見つかるかどうか、もし見つかるならどのオブジェクトの中でかを、人間の読み手または JavaScript コンパイラが決定するのを難しくします。つまり、この例で考えると:
    function f(x, o) {
      with (o)
        print(x);
    }
    

    f が呼び出されたときのみ、x が見つかるかどうか、もし見つかるなら、o の中でか、または (そのようなプロパティが存在しなければ) f のアクティベーションオブジェクト――そこで、x は最初の仮引数の名前です――の中でか、が決定されます。もし第 2 引数として渡したオブジェクトの中で x を定義するのを忘れた、または何らかの似たようなバグあるいは混乱があったのなら、エラーが起きることなく、ただ予期しない結果が得られるでしょう。

[編集]

[編集] 例: with を使う

次の with 文は、Math オブジェクトがデフォルトのオブジェクトであると指定しています。with 文の次の複数の文は、オブジェクトを指定することなしに、PI プロパティ、cos メソッド、および sin メソッドを参照しています。JavaScript は、これらの参照に対して Math オブジェクトを仮定します。

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