приведу классический пример:
Array.prototype.each= function( callback ){
for( var i= 0, len= this.length; i < len; ++i )
callback.call( this, this[ i ], i );
};
var summ= 0;
[-1,1,2,3].each( function( val, key ){ summ+= val } );
alert( summ );
тут в метод итерирования передаётся функция замкнутая на текущий контекст, которая должна выполнить нужные нам операции для каждого элемента массива. довольно многословно, не правда ли? было бы замечательно хотябы сделать короткий алиас для ключевого слова function, но яваскрипт ничего такого не позволяет -_-
единственное возможное решение в таком случае - использовать какой-либо препроцессор. но завязываться на серверную или оффлайновую предобработку как-то не очень хочется. а если помещать код в яваскрипт в виде строки, то мы теряем подсветку синтаксиса. тобишь необработанный код должен сохранять синтаксическую совместимость с яваскриптом.
что ж, решение есть и довольно красивое... вот простая функция, динамически меняющая исходный код переданной в качестве аргумента функции:
var $func= function( func ){
eval(
'func=' + String( func )
.replace( /\{\$:/g, 'function($){return ' )
);
return func;
};
а вот пример использования:
$func( function( ){
Array.prototype.each= function( callback ){
for( var i= 0, len= this.length; i < len; ++i )
callback.call( this, { key: i, val: this[ i ] } );
};
var summ= 0;
[-1,1,2,3].each( {$: summ+= $.val } );
alert( summ );
})();
тут весь код приложения засовывается в функцию, пропускается через препроцессор и потом исполняется. при этом внутри можно создавать инлайн-функции используя простой и элегантный синтаксис:
{$: /* какой-то код,
результат выполнения которого будет возвращён функцией */ }