var \r
- X_Callback_LIVE_LIST = [],\r
+ X_CLOSURE_LIVE_LIST = [],\r
\r
- X_Callback_POOL_LIST = [],\r
+ X_CLOSURE_POOL_LIST = [],\r
\r
- X_Closure_COMMAND_BACK = X_Callback_LIVE_LIST,\r
+ X_Closure_COMMAND_BACK = X_CLOSURE_LIVE_LIST,\r
\r
- X_Closure_COMMAND_DROP = X_Callback_POOL_LIST,\r
+ X_Closure_COMMAND_DROP = X_CLOSURE_POOL_LIST,\r
\r
- /** @const */\r
- X_Callback_THIS_FUNC = 1,\r
- /** @const */\r
- X_Callback_HANDLEEVENT = 2,\r
- /** @const */\r
- X_Callback_FUNC_ONLY = 3,\r
- /** @const */\r
- X_Callback_THIS_FUNCNAME = 4;\r
+ X_CLOSURE_THIS_FUNC = 1,\r
+ X_CLOSURE_HANDLEEVENT = 2,\r
+ X_CLOSURE_FUNC_ONLY = 3,\r
+ X_CLOSURE_THIS_FUNCNAME = 4;\r
\r
/**\r
* <p>クロージャに関するポリシーと再利用可能クロージャについて次の記事をご覧ください。\r
* <a href="http://outcloud.blogspot.jp/2015/05/reusable-closure.html" target="_blank">再利用できるクロージャを使ったWebアプリケーション開発</a>\r
* \r
* <h5>再利用可能クロージャの作成</h5>\r
- * X_Callback_create() で再利用可能なクロージャの作成。次のパターンで呼び出します。<br>\r
+ * X_Closure_create() で再利用可能なクロージャの作成。次のパターンで呼び出します。<br>\r
* 最大で三つの引数を並べる一連のパターンは、 EventDispatcher.listen unlisten, listening や X.Timer.add, once でも使われますので、ここでよく目を通しておきます。\r
* \r
* <h5>再利用可能クロージャの破棄と再利用</h5>\r
- * X_Callback_correct() によってクロージャは回収され再利用に備えます。<br>\r
+ * X_Closure_correct() によってクロージャは回収され再利用に備えます。<br>\r
* 実は、クロージャが束縛するのは、this コンテキストやコールバック関数といった、<strong>そのもの</strong>ではなく、それらを一定のルールで格納したハッシュです。<br>\r
* このハッシュはクロージャに与えた後も、適宜に取得が可能です。このハッシュのメンバーを書き換えることで、クロージャの this コンテキストやコールバック関数を書き換えています。\r
* \r
* コールバックの種類を表す数値。 this + function, this.handleEvent, function only がある。\r
* @type {number} \r
*/\r
- kind : X_Callback_THIS_FUNC,\r
+ kind : X_CLOSURE_THIS_FUNC,\r
/**\r
* コールバック。\r
* @type {funciton|undefined} \r
* __CallbackHash__ の情報を元に、コールバックを実施するプロキシ。\r
* @type {Function}\r
*/\r
- proxy : X_Callback_proxyCallback\r
+ proxy : X_Closure_proxyCallback\r
};\r
\r
// ------------------------------------------------------------------------- //\r
// --- implements ---------------------------------------------------------- //\r
// ------------------------------------------------------------------------- //\r
\r
-function X_Callback_create( thisObject, opt_callback, opt_args /* [ listener || ( context + function ) || function ][ args... ] */ ){\r
- var obj = X_Callback_classifyCallbackArgs( thisObject, opt_callback, opt_args ),\r
+function X_Closure_create( thisObject, opt_callback, opt_args /* [ listener || ( context + function ) || function ][ args... ] */ ){\r
+ var obj = X_Closure_classifyCallbackArgs( thisObject, opt_callback, opt_args ),\r
l, ret, _obj;\r
\r
if( !obj.kind ) return obj;\r
\r
- if( l = X_Callback_POOL_LIST.length ){\r
- ret = X_Callback_POOL_LIST[ l - 1 ]; --X_Callback_POOL_LIST.length; // ret = X_Callback_POOL_LIST.pop();\r
+ if( l = X_CLOSURE_POOL_LIST.length ){\r
+ ret = X_CLOSURE_POOL_LIST[ l - 1 ]; --X_CLOSURE_POOL_LIST.length; // ret = X_CLOSURE_POOL_LIST.pop();\r
_obj = ret( X_Closure_COMMAND_BACK );\r
\r
_obj.kind = obj.kind;\r
_obj.func = obj.func;\r
_obj.context = obj.context;\r
_obj.supplement = obj.supplement;\r
- _obj.proxy = X_Callback_proxyCallback;\r
+ _obj.proxy = X_Closure_proxyCallback;\r
} else {\r
- ret = X_Callback_actualClosure( obj );\r
- obj.proxy = X_Callback_proxyCallback;\r
+ ret = X_Closure_actualClosure( obj );\r
+ obj.proxy = X_Closure_proxyCallback;\r
};\r
- X_Callback_LIVE_LIST[ X_Callback_LIVE_LIST.length ] = ret;\r
+ X_CLOSURE_LIVE_LIST[ X_CLOSURE_LIVE_LIST.length ] = ret;\r
return ret;\r
};\r
\r
\r
-function X_Callback_classifyCallbackArgs( arg1, arg2, arg3, alt_context ){\r
+function X_Closure_classifyCallbackArgs( arg1, arg2, arg3, alt_context ){\r
var obj;\r
\r
if( X_Type_isObject( arg1 ) && X_Type_isFunction( arg2 ) ){\r
- obj = { context : arg1, func : arg2, kind : X_Callback_THIS_FUNC };\r
+ obj = { context : arg1, func : arg2, kind : X_CLOSURE_THIS_FUNC };\r
} else\r
if( X_Type_isObject( arg1 ) ){\r
if( arg2 && X_Type_isString( arg2 ) ){\r
- obj = { context : arg1, name : arg2, kind : X_Callback_THIS_FUNCNAME };\r
+ obj = { context : arg1, name : arg2, kind : X_CLOSURE_THIS_FUNCNAME };\r
} else {\r
- obj = { context : arg1, kind : X_Callback_HANDLEEVENT };\r
+ obj = { context : arg1, kind : X_CLOSURE_HANDLEEVENT };\r
arg3 = arg2; \r
};\r
} else\r
if( X_Type_isFunction( arg1 ) ){\r
arg3 = arg2;\r
if( alt_context ){\r
- obj = { context : alt_context, func : arg1, kind : X_Callback_THIS_FUNC };\r
+ obj = { context : alt_context, func : arg1, kind : X_CLOSURE_THIS_FUNC };\r
} else {\r
- obj = { func : arg1, kind : X_Callback_FUNC_ONLY };\r
+ obj = { func : arg1, kind : X_CLOSURE_FUNC_ONLY };\r
};\r
} else\r
if( X_Type_isFunction( arg2 ) ){\r
- //console.log( 'X_Callback_classifyCallbackArgs : arg1 が ' + arg1 + 'です' ); ie4 で error\r
+ //console.log( 'X_Closure_classifyCallbackArgs : arg1 が ' + arg1 + 'です' ); ie4 で error\r
if( alt_context ){\r
- obj = { context : alt_context, func : arg2, kind : X_Callback_THIS_FUNC };\r
+ obj = { context : alt_context, func : arg2, kind : X_CLOSURE_THIS_FUNC };\r
} else {\r
- obj = { func : arg2, kind : X_Callback_FUNC_ONLY };\r
+ obj = { func : arg2, kind : X_CLOSURE_FUNC_ONLY };\r
};\r
} else\r
if( alt_context && X_Type_isString( arg1 ) ){\r
arg3 = arg2;\r
- obj = { context : alt_context, name : arg1, kind : X_Callback_THIS_FUNCNAME };\r
+ obj = { context : alt_context, name : arg1, kind : X_CLOSURE_THIS_FUNCNAME };\r
} else\r
if( alt_context ){\r
- obj = { context : alt_context, kind : X_Callback_HANDLEEVENT };\r
+ obj = { context : alt_context, kind : X_CLOSURE_HANDLEEVENT };\r
arg3 = arg1;\r
} else {\r
console.log( '不正 ' + arg1 );\r
return ( obj.context || obj.supplement ) ? obj : arg1;\r
};\r
\r
-function X_Callback_actualClosure( obj ){\r
+function X_Closure_actualClosure( obj ){\r
return function(){\r
if( arguments[ 0 ] === X_Closure_COMMAND_BACK ) return obj;\r
if( arguments[ 0 ] !== X_Closure_COMMAND_DROP ) return obj.proxy && obj.proxy( obj, arguments );\r
};\r
};\r
\r
-function X_Callback_proxyCallback( xfunc, _args ){\r
+function X_Closure_proxyCallback( xfunc, _args ){\r
var args = _args || [],\r
thisObj = xfunc.context,\r
func = xfunc.func,\r
\r
switch( xfunc.kind ){\r
\r
- case X_Callback_THIS_FUNC :\r
+ case X_CLOSURE_THIS_FUNC :\r
return args.length === 0 ? func.call( thisObj ) : func.apply( thisObj, args );\r
\r
- case X_Callback_THIS_FUNCNAME :\r
+ case X_CLOSURE_THIS_FUNCNAME :\r
funcName = xfunc.name;\r
- case X_Callback_HANDLEEVENT :\r
+ case X_CLOSURE_HANDLEEVENT :\r
funcName = funcName || 'handleEvent';\r
temp = thisObj[ funcName ];\r
if( X_Type_isFunction( temp ) ){\r
};\r
return args.length === 0 ? func.call( thisObj ) : func.apply( thisObj, args );*/\r
\r
- case X_Callback_FUNC_ONLY :\r
+ case X_CLOSURE_FUNC_ONLY :\r
return args.length === 0 ?\r
func() :\r
args.length === 1 ?\r
func( args[ 0 ] ) :\r
func.apply( null, args );\r
};\r
- return X_Callback_NONE;\r
+ return X_CALLBACK_NONE;\r
};\r
\r
-function X_Callback_correct( f ){\r
- var i = X_Callback_LIVE_LIST.indexOf( f ),\r
+function X_Closure_correct( f ){\r
+ var i = X_CLOSURE_LIVE_LIST.indexOf( f ),\r
obj;\r
if( i !== -1 ){\r
- X_Callback_LIVE_LIST.splice( i, 1 );\r
- X_Callback_POOL_LIST[ X_Callback_POOL_LIST.length ] = f;\r
+ X_CLOSURE_LIVE_LIST.splice( i, 1 );\r
+ X_CLOSURE_POOL_LIST[ X_CLOSURE_POOL_LIST.length ] = f;\r
obj = f( X_Closure_COMMAND_BACK );\r
+ /*\r
delete obj.kind;\r
if( obj.name ) delete obj.name;\r
if( obj.func ) delete obj.func;\r
if( obj.context ) delete obj.context;\r
if( obj.supplement ) delete obj.supplement;\r
- delete obj.proxy;\r
+ delete obj.proxy; */\r
+ X_Object_clear( obj );\r
return true;\r
};\r
return false;\r
};\r
\r
-function X_Callback_monitor(){\r
+function X_Closure_monitor(){\r
return {\r
- 'Callback:Live' : X_Callback_LIVE_LIST.length,\r
- 'Callback:Pool' : X_Callback_POOL_LIST.length\r
+ 'Callback:Live' : X_CLOSURE_LIVE_LIST.length,\r
+ 'Callback:Pool' : X_CLOSURE_POOL_LIST.length\r
};\r
};\r
-function X_Callback_gc(){\r
- X_Callback_POOL_LIST.length = 0; // ?\r
-};
\ No newline at end of file
+function X_Closure_gc(){\r
+ X_CLOSURE_POOL_LIST.length = 0; // ?\r
+};\r
+\r
+X_TEMP.onSystemReady.push( function( sys ){\r
+ sys.monitor( X_Closure_monitor );\r
+ sys.gc( X_Closure_gc );\r
+});\r
+\r
+\r