function work(options){
/*
{ FUNC callback [,INT time] [, STR type] [, STR || ARR args] }
понятно ? :)
*/
// аргумент должен быть один - OBJ или ARR
if(arguments.length !== 1) throw(new Error('Undefined Arguments'));
// если это массив (у хеша нет длины), то делаем то что надо .. *!*в [ [scope] ] window*/!*
if( !!options.length ) { options[0].apply(window,options[1]);return; }
// без функции, которую надо исполнить ( колбек ) , не работаем
if( !options.callback ) throw(new Error('I need Callback!'));
// одновременно подставляем строку в аргументы колбека, если они не указаны. И, если это не массив (надо массив), то преобразуем в массив. *!* тут будет баг, если аргументы будут хешем.( args:{a:'a',b:"b"} ) */!*
if( (options.args=options.args||'').constructor.toString().indexOf("Array") == -1 ) options.args = [ options.args ];
// коэффициент, т.к. setTimeout требует время в милисекундах
var k = 1000;
switch(options.type){
case'minute': k *= 60;
break;
case'hour': k *= 3600; // 60*60
break;
case'day' : k *= 86400; // 60*60*24
break;
// если не указан, то остается тысячей. я убрал default
}
/* если время не указано, то оно будет 1 секундой , умноженной на коэф.
заметим, что функции передается уже массив
*/
setTimeout( function(){ work( [ options.callback, options.args ] ); } , (options.time||1)*k );
}
work( { time:3, callback: alert } )
work( { time:7, callback: alert, args : "Callback number two" } )
work( { time:1, callback: alert, args: { a:'a',b:'b' } } ) // демонстрация бага. хотя.. если сделать alert({ a:'a',b:'b' }), то будет то же самое!
// кстати, как вы думаете, в каком порядке будут исполнены функции?
alert({ a:'a',b:'b' })