Chcem aby moja funkcia zavolala druhú a vrátila jej výsledok. Chcem tiež aby jej odovzdala rovnaké parametre.
Asi takto:
my_fn() zavolá a vráti výsledok my_fn2()
my_fn(a,b,c) zavolá a vráti výsledok my_fn2(a,b,c)
my_fn(a,b,c,d) zavolá a vráti výsledok my_fn2(a,b,c,d)
..v skratke, neviem koľko parametrov budem odovzdávať, ale chcem, aby sa poslali ďalej do konkrétnej funkcie. Takto budem chcieť prepojiť viacero funkcií, takže som na to šiel takto:
var my_fn = function()
{
return _fn_call( 'my_fn2' , arguments );
// _fn_call bude fcia, ktorá prijíme dva parametre:
// prvý = názov fcie, ktorá sa má zavolať
// druhý = pole obsahujúce predané argumenty
};
var _fn_call = function( fn_name , args_array )
{
// vytvorí srtingový výraz, ako by sa mala fcia zavolať
// a odovzdá ho fcii eval()
var i, args = [];
for( i=0 ; i<args_array.length ; i++ ) args.push( 'args_array[' + i + ']' );
return eval( fn_name + '(' + args.join( ',' ) + ')' );
}
Čiastočne to funguje. Problém je, že sa to picha do stringu, a nakoniec tá fcia eval... proste humus. Vedel by sa to prekusnúť, keby som takto nepotreboval volať funkcie z iného scope. To znamená že chcem odovzdávať cieľovú funkciu referenciou, a nie stringovým názvom fcie. Asi takto:
var my_fn = function() { return _fn_call( my_fn2 , arguments ) };
// šlo by to potom aj anonymne (vedľajší produkt)
var my_fn = function() { return _fn_call( function() { ... } , arguments ) };
Ja ale teraz neviem napísať fciu _fn_call pre dopredu neznámy počet argumentov. Nedá sa to ani pichnúť do evalu. Viem len niečo takéto:
var _fn_call = function( fn_ref , args )
{
switch( args.length )
{
case 0: return fn_ref( );
case 1: return fn_ref( args[ 0 ] );
case 2: return fn_ref( args[ 0 ], args[ 1 ] );
case 3: return fn_ref( args[ 0 ], args[ 1 ], args[ 2 ] );
...
}
};
...aj keď to je ešte vačší humus ako pred tým, funguje aspoň to odovzdávanie referenciou. Nevýhoda je konečný počet argumentov.
Nepozná niekto nejaké pekné riešenie ? (vopred ďakujem ;-)