Files
krkr2doc/docs/tjs2doc/contents/with.html
2016-09-08 17:50:19 +09:00

138 lines
7.3 KiB
HTML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<!-- generated by to_html.pl from with.xml -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>with ステートメント</title>
<meta name="author" content="W.Dee" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<link href="browser.css" type="text/css" rel="stylesheet" title="吉里吉里関連リファレンス用標準スタイル" />
<link href="mailto:[email protected]" rev="Made" />
<link href="index.html" target="_top" rel="Start" title="トップページ" />
</head>
<body>
<h1><a id="id601" name="id601">with ステートメント</a>
</h1><div class="para"><div>
 <a id="id602" name="id602" class="targanchor"><dfn>with</dfn></a> ステートメントは、<code class="inlinecode">.</code> (ドット) 演算子における左側 (オブジェクト) を省略した場合に参照するオブジェクトを指定するものです。<br />
<br />
 構文は以下の通りです。<br />
<br />
<code class="bq">with(expression)<br />
&nbsp;&nbsp;&nbsp;&nbsp;ステートメントまたはブロック<br />
</code>
<br />
<br />
 「ステートメントまたはブロック」内で、左側が省略された <code class="inlinecode">.</code> (ドット)演算子が使用された場合、その <code class="inlinecode">.</code> (ドット)演算子が参照するオブジェクトは、with ステートメントの expression で指定したオブジェクトになります。<br />
<br />
<br />
<code class="bq"><span class="weak">例:</span><br />&nbsp;&nbsp;&nbsp;&nbsp;with(obj)&nbsp;.member&nbsp;=&nbsp;1;&nbsp;<span class="comment">//&nbsp;obj.member&nbsp;=&nbsp;1;&nbsp;と同じ</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;with(obj)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.member1&nbsp;=&nbsp;1;&nbsp;<span class="comment">//&nbsp;obj.member1&nbsp;&nbsp;1&nbsp;を代入</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.member2&nbsp;=&nbsp;2;&nbsp;<span class="comment">//&nbsp;obj.member2&nbsp;&nbsp;2&nbsp;を代入</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.member3++;&nbsp;<span class="comment">//&nbsp;obj.member3&nbsp;をインクリメント</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.method();&nbsp;<span class="comment">//&nbsp;obj.method&nbsp;を呼び出す</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</code>
<br />
<br />
 このステートメントは特に、オブジェクトに大量のプロパティを設定したり、連続してメソッドを呼ぶ際に、タイピングを減らすことができます。<br />
<br />
 たとえば<br />
<br />
<br />
<code class="bq">&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;object&nbsp;=&nbsp;new&nbsp;Foo();<br />
&nbsp;&nbsp;&nbsp;&nbsp;object.setPos(0,&nbsp;0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;object.setSize(100,&nbsp;100);<br />
&nbsp;&nbsp;&nbsp;&nbsp;object.name&nbsp;=&nbsp;&quot;名前無し&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;object.color&nbsp;=&nbsp;0xffffffff;<br />
</code>
<br />
<br />
 のようなスクリプトを以下のように書くことができます。<br />
<br />
<br />
<code class="bq">&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;object&nbsp;=&nbsp;new&nbsp;Foo();<br />
&nbsp;&nbsp;&nbsp;&nbsp;with(object)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.setPos(0,&nbsp;0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.setSize(100,&nbsp;100);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.name&nbsp;=&nbsp;&quot;名前無し&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.color&nbsp;=&nbsp;0xffffffff;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</code>
<br />
<br />
</div></div>
<h1><a id="id603" name="id603">with ステートメントとオブジェクト</a>
</h1><div class="para"><div>
 with ステートメントで指定した expression は、with が実行される最初に1回だけ評価され、あとはそれを参照するだけになります。<br />
<br />
 たとえば、<br />
<br />
<br />
<code class="bq">this.dic&nbsp;=&nbsp;%[];<br />
with(this.dic)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;.member&nbsp;=&nbsp;1;&nbsp;<span class="comment">//&nbsp;this.dic.member&nbsp;&nbsp;1&nbsp;を代入</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;this.dic&nbsp;=&nbsp;0;&nbsp;<span class="comment">//&nbsp;dic&nbsp;に何か別の物を代入</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;.member&nbsp;=&nbsp;2;&nbsp;<span class="comment">//&nbsp;this.dic.member&nbsp;&nbsp;2&nbsp;を代入</span><br />
}<br />
</code>
<br />
<br />
 と書いても、2回目の .member への代入は成功するでしょう。with が実行される最初の状態で this.dic が評価され、あとはその評価された結果を用いているからです。毎回 this.dic を評価する訳ではありません。<br />
<br />
 評価は最初の1回だけのため、何回もオブジェクトを参照するような用途では、オブジェクトを参照するためのコードが毎回生成されるようなことがなくなり、高速になる場合があります。<br />
<br />
 上記の例は以下と等価のコードが生成されると考えることが出来ます。<br />
<br />
<br />
<code class="bq">this.dic&nbsp;=&nbsp;%[];<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;無名の特別なローカル変数&nbsp;=&nbsp;this.dic;<br />
&nbsp;&nbsp;&nbsp;&nbsp;無名の特別なローカル変数.member&nbsp;=&nbsp;1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.dic&nbsp;=&nbsp;0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;無名の特別なローカル変数.member&nbsp;=&nbsp;2;<br />
}<br />
</code>
<br />
<br />
 with ステートメントでは、左側が省略された . (ドット) 演算子でしかアクセスできない、無名の特別なローカル変数に expression の評価の結果が代入され、以降、左側が省略された . (ドット) 演算子では、その「無名の特別なローカル変数」が参照されるようになります。<br />
 expression を評価した結果が保持されるスコープも、上記の「無名の特別なローカル変数」のローカル変数スコープと同じとみなすことができます ( with ステートメントが影響を与える範囲もその通りとなります )。<br />
</div></div>
<h1><a id="id604" name="id604">with ステートメント外での . 演算子</a>
</h1><div class="para"><div>
 with ステートメント外で <code class="inlinecode">.</code> (ドット) 演算子の左側が省略された場合、グローバルオブジェクトを参照することになります。<br />
 たとえば、with ステートメント外で<br />
<br />
<code class="inlinecode">.foo = 1;</code><br />
<br />
 と記述すると<br />
<br />
<code class="inlinecode">global.foo = 1;</code><br />
<br />
 と同じ意味になります。<br />
</div></div>
<script type="text/javascript" charset="UTF-8" src="documentid.js" ></script>
<script type="text/javascript" charset="UTF-8" src="postcontent.js" ></script>
</body>
</html>