Apply your JS skills to key Mozilla projects as an MDN Fellow! http://mzl.la/MDNFellowship

mozilla
Your Search Results

    with

    概要

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

    Statement
    実装されたバージョン JavaScript 1.0
    ECMAScript エディション ECMA-262

    構文

    with (object) {statement
    }

    引数

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

    説明

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

    with の利用は非推奨であり、ECMAScript 5 の strict mode では禁止されています。推奨される代替案は、参照したいプロパティを持つオブジェクトを一時変数に代入することです。
    (歴史的な注記: Firefox 1.5 は、with 文が使われたときに、"deprecated with statement usage" という警告を出していました。これは Firefox 1.5.0.1 で削除されました (バグ 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);
    }

    ドキュメントのタグと貢献者

    タグ: 
    Contributors to this page: dextra, Nanto vi, ethertank, teoli, Mgjbot
    最終更新者: teoli,