<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>memo.393 &#187; Closure</title>
	<atom:link href="http://memo.393.bz/archives/tag/closure/feed" rel="self" type="application/rss+xml" />
	<link>http://memo.393.bz</link>
	<description>個人的メモです。間違いなどありましたらご指摘ください。。。</description>
	<lastBuildDate>Sat, 31 Jul 2010 13:55:47 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>[AS]クロージャのイイ感じの使用用途</title>
		<link>http://memo.393.bz/archives/726</link>
		<comments>http://memo.393.bz/archives/726#comments</comments>
		<pubDate>Mon, 10 Aug 2009 22:06:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Closure]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://memo.393.bz/?p=726</guid>
		<description><![CDATA[クロージャとは、functionの中にfunctionを書くような書き方。（だと思う）
フレームに書いたらこんな感じ。


//フレームアクション
function test(){
	var func:Function  [...]]]></description>
			<content:encoded><![CDATA[<p>クロージャとは、functionの中にfunctionを書くような書き方。（だと思う）<br />
フレームに書いたらこんな感じ。</p>
<pre name="code" class="as">

//フレームアクション
function test(){
	var func:Function  = new Function();
	func = function(){
		trace(&quot;func内this : &quot; + this);//出力：func内this : [object global]
	}
	trace(&quot;test内this : &quot; + this);//出力：test内this : [object MainTimeline]
	func();
}
test();
</pre>
<p>これ使うと関数内のthisが何を示すか混乱するのよ。(私にとっては、ね）。<br />
なので、あまり使わないようにしてたけど、便利そうな使い方を教わったのでご紹介。</p>
<p>たとえば、フェードイン処理とフェードアウト処理について。<br />
以下のように書くことですっきりまとまる。</p>
<pre name="code" class="as">

package {
	public class Main extends Sprite {
		//関数をインスタンス化しておく
		private var fader:Function = new Function();

		public function fadeIn( speed:Number ) : void {
			//※addEventListenerされてない状態をremoveしてもエラーにはならない
			removeEventListener( Event.ENTER_FRAME, fader )
			//リスナー関数をaddEventListenerと同じ位置にかく
			//fader関数の中身を設定
			fader = function( e:Event ) : void {
				alpha += speed;
				if( alpha &gt;= 1 ) {
					removeEventListener( Event.ENTER_FRAME, fader )
				}
			}
			addEventListener( Event.ENTER_FRAME, fader )
		}

		public function fadeOut( speed:Number ) : void {
			//※addEventListenerされてない状態をremoveしてもエラーにはならない
			removeEventListener( Event.ENTER_FRAME, fader )
			//fader関数の中身を設定
			fader = function( e:Event ) : void {
				alpha -= speed;
				if( alpha &lt;= 0 ) {
					removeEventListener( Event.ENTER_FRAME, fader )
				}
			}
			addEventListener( Event.ENTER_FRAME, fader )
		}
	}
}
</pre>
<p>ポイントのひとつは、フェードインもアウトも同じfaderという関数を使っているところ。<br />
インとアウトが同時実行されることはない。(remove処理が確実に行われる)<br />
同時に実行させる必要があれば、新しいFunctionインスタンスを作ればよい。<br />
あと、Functionインスタンスがnullでなければ、addEventListenerしてない状態で、removeEventListenerしてもエラーにはならない。</p>
<p>この書き方なら、フェード処理をもっと細かく設定したい場合も以下のようにすっきりかける。</p>
<pre name="code" class="as">

//フェードイン関数のみ抽出
public function fadeIn( speed:Number ) : void
{
	removeEventListener( Event.ENTER_FRAME, fader )
	fader = function( e:Event ) : void
	{
		alpha += speed;
		//追加：アルファが0.5以上になったら、スピードを半分にする
		if( alpha &gt;= 0.5) {
			removeEventListener( Event.ENTER_FRAME, fader )
			fader = function( e:Event ) : void
			{
				alpha += speed/2
				if( alpha &gt;= 1) {
					removeEventListener( Event.ENTER_FRAME, fader )
				}
			}
			addEventListener( Event.ENTER_FRAME, fader )
		}
	}
	addEventListener( Event.ENTER_FRAME, fader )
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://memo.393.bz/archives/726/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
